CINXE.COM
Talk:Best practices for extensions - MediaWiki
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-disabled 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-not-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>Talk:Best practices for extensions - MediaWiki</title> <script>(function(){var className="client-js vector-feature-language-in-header-disabled 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-not-available";var cookie=document.cookie.match(/(?:^|; )mediawikiwikimwclientpreferences=([^;]+)/);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":true,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""], "wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"defb57f9-25f0-4170-a97d-9e2e0607baa4","wgCanonicalNamespace":"Talk","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":1,"wgPageName":"Talk:Best_practices_for_extensions","wgTitle":"Best practices for extensions","wgCurRevisionId":2650184,"wgRevisionId":0,"wgArticleId":744841,"wgIsArticle":false,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":[],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"flow-board","wgRelevantPageName":"Talk:Best_practices_for_extensions","wgRelevantArticleId":744841,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"mediawiki","wgCiteReferencePreviewsActive":true,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true, "wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":1,"wgFlowData":{"title":"Talk:Best practices for extensions","categories":[],"specialCategoryLink":"/wiki/Special:Categories","workflow":"u3zld3xbhh9t5t0y","blocks":{"header":{"type":"header","editToken":null,"revision":{"actions":{"edit":{"url":"//www.mediawiki.org/w/index.php?title=Talk:Best_practices_for_extensions\u0026action=edit-header","title":"Edit description","text":"Edit description"}},"links":[]},"copyrightMessage":"","submitted":[],"errors":[],"title":"Talk:Best practices for extensions","block-action-template":"","editFont":"monospace"},"topiclist":{"submitted":{"action":"view"},"errors":[],"sortby":"updated","roots":["y30g8almolxpfjcg","wqvqvhgsvpu1je15","ur1vlumaj7yboynl","uxot1wc2nefkjbwo","wovr2kqb7qwhztwu", "wp7kzldzuigdbsbg","wp7lbx9iay3b93my","uwqk40oa4gei3h9m","uxojqdvbtjpbbb94","uwqjvrjzh84larvx"],"posts":{"y30g8almolxpfjcg":["y30k9jo4tdp768nr"],"y30g8almopvrnnao":["y30g8almopvrnnao"],"y30hzy5ipwb02g46":["y30hzy5ipwb02g46"],"wqvqvhgsvpu1je15":["wqvuu2axkjdp8uka"],"wqvqvhgsvts3rhzd":["wqvqwjyk1u4y8hlo"],"wqw6lnnhy3kgbuli":["wqw6lnnhy3kgbuli"],"wqxfljr257j8ir7m":["wqxfljr257j8ir7m"],"wqztx8tryinygmbs":["wqztxig8eov8d5gw"],"wr01pzpsxubdhhxt":["wr01pzpsxubdhhxt"],"wr0ge8ldo1itlxrm":["wr0ge8ldo1itlxrm"],"wr0h57cgmyhlw6ld":["wr0h57cgmyhlw6ld"],"wr0i9fnl1dopx6we":["wr0i9fnl1dopx6we"],"wsm58zwb72uarhpw":["wsm58zwb72uarhpw"],"wsm8iy6ptpmd8gii":["wsm8iy6ptpmd8gii"],"ur1vlumaj7yboynl":["wr0i8lkz6xc02097"],"ur1vlumajbwdx2lt":["ur1vlumajbwdx2lt"],"wovcw3sx8052esva":["wovcw3sx8052esva"],"uxot1wc2nefkjbwo":["wr0i74njq3y2nho2"],"uxot1wc2nidmrfuw":["uxot1wc2nidmrfuw"],"uzc3sc6z23ylkzdo":["uzc3sc6z23ylkzdo"],"wr0i728xgpgozp40":["wr0i728xgpgozp40"],"wovr2kq9nqewvr5a":["wovr2kq9nqewvr5a"], "wovr2kqb7qwhztwu":["wovr2kqb7svj3vvy"],"wovsb0lv4cczkjla":["wovsb0lv4cczkjla"],"wovwygetm6d1xeqt":["wovx1zx5l41y8roq"],"wovzkhex07e59vbi":["wovzkhex07e59vbi"],"wows6m2id6uya1tb":["wows9yczwhrszn2b"],"wox8bnjv7h1yo5s7":["wox8bnjv7h1yo5s7"],"wpdnhzjvkqs13tew":["wpdnhzjvkqs13tew"],"wpek4xn1zz31dbj7":["wpek4xn1zz31dbj7"],"wp7lbx9iay3b93my":["wpa3epq1gwv527ew"],"wp7lbx9ib21dh7l6":["wp7lbx9ib21dh7l6"],"wp7vdv8gk2lvr17k":["wp7vdv8gk2lvr17k"],"wpa1atwjzbg08hk2":["wpa1atwjzbg08hk2"],"uwqk40oa4gei3h9m":["wovd2orz2q3be7or"],"uwqk40oa4kckbl7u":["uwqk40oa4kckbl7u"],"uwqty1k00dlhihhx":["uwqty1k00dlhihhx"],"uxojldfki2bzs7je":["uxojldfki2bzs7je"],"uxpkm4vvzcmjtt7u":["uxpkm4vvzcmjtt7u"],"uxq4yfynm8k6wns5":["uxq4yfynm8k6wns5"],"uxyqjbaso24al6xh":["uxyqjbaso24al6xh"],"uxytkm182whbtvim":["uxytkm182whbtvim"],"uxz7intr6fnf16pe":["uxz7intr6fnf16pe"],"uxz8632iplamrjr1":["uxzaoqkrjonqrd85"],"uxze4frlnpn1ptud":["uxze4frlnpn1ptud"],"uxzepcsigdj4q5xe":["uxzepcsigdj4q5xe"],"uxzi9d5nt34x61xx":["uxzi9d5nt34x61xx"], "uy2zhsexslw0zgwl":["uy2zhsexslw0zgwl"],"wovd2hk5tlmutrmp":["wovd2hk5tlmutrmp"],"uxojqdvbtjpbbb94":["wovd0g6ktegst8up"],"uxojqdvbtnndjf7c":["uxojqdvbtnndjf7c"],"uxopqqqq2ak2cjra":["uxopqqqq2ak2cjra"],"uwqjvrjzh84larvx":["wovcztbrv6bqc8xu"],"uwqjvrjzhc2nivu5":["uwqjvrjzhc2nivu5"],"uwqlacrn7xqtpynh":["uwqlacrn7xqtpynh"],"wovczoik2vzlb3qb":["wovczoik2vzlb3qb"],"wp7kzldzuigdbsbg":["wp7kzldzukfefuak"],"wp7kzldzumefjw9o":["wp7ltp7q9l2phdwq"],"wp84f6t8k9eizygi":["wp84f6t8k9eizygi"],"wp8ovftzfnrjyo0s":["wp8ovftzfnrjyo0s"],"wpdnr8rcnnv50lid":["wpdnr8rcnnv50lid"],"wpecj1cjbkjy44qx":["wpecj1cjbkjy44qx"]},"revisions":{"y30k9jo4tdp768nr":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"y30g8almolxpfjcg","articleTitle":"Topic:Y30g8almolxpfjcg","revisionId":"y30k9jo4tdp768nr","timestamp":"20240416114548","changeType":"lock-topic","dateFormats":[],"properties":{"topic-of-post":{}, "topic-of-post-text-from-html":{}},"isOriginalContent":true,"isModerated":true,"links":{"topic":{"url":"//www.mediawiki.org/wiki/Topic:Y30g8almolxpfjcg","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026action=history","title":"History","text":"History"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026action=unwatch","title":"Unwatch","text":"Unwatch"},"topic-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026topic_revId=y30k9jo4tdp768nr\u0026action=single-view","title":"topic revision","text":"topic revision"}},"actions":[],"size":{"old":"48","new":"48"},"author":{"name":"Kghbln","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Kghbln","title": "Contributions/Kghbln","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Kghbln","title":"Kghbln","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Kghbln","title":"User talk:Kghbln","exists":true,"_BC_bools":["exists"]}},"id":189117},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":"y30g8almonwqjlbk","moderator":{"name":"Kghbln","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Kghbln","title":"Contributions/Kghbln","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Kghbln","title":"Kghbln","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Kghbln","title":"User talk:Kghbln","exists":true,"_BC_bools":["exists"]}},"id":189117},"moderateState":"lock","moderateReason":{"content":"marked as resolved","format":"plaintext"},"isLocked":true,"isModeratedNotLocked":false,"content":{"content": "bad links for doclink/html and doclink/Sanitizer","format":"topic-title-html","plaintext":"bad links for doclink/html and doclink/Sanitizer"},"watchable":false,"replyToId":null,"postId":"y30g8almolxpfjcg","isMaxThreadingDepth":false,"creator":{"name":"Wladek92","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Wladek92","title":"Contributions/Wladek92","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Wladek92","title":"Wladek92","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Wladek92","title":"User talk:Wladek92","exists":true,"_BC_bools":["exists"]}},"id":887141},"isNewPage":false,"replies":["y30g8almopvrnnao","y30hzy5ipwb02g46"],"reply_count":2,"last_updated_readable":"11:45, 16 April 2024","last_updated":1713267948000},"y30g8almopvrnnao":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId": "y30g8almolxpfjcg","articleTitle":"Topic:Y30g8almolxpfjcg","revisionId":"y30g8almopvrnnao","timestamp":"20240416103321","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Y30g8almolxpfjcg","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026topic_showPostId=y30g8almopvrnnao#flow-post-y30g8almopvrnnao","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026topic_postId=y30g8almopvrnnao\u0026topic_revId=y30g8almopvrnnao\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026action=watch","title":"Watch","text":"Watch"} ,"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"379"},"author":{"name":"Wladek92","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Wladek92","title":"Contributions/Wladek92","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Wladek92","title":"Wladek92","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Wladek92","title":"User talk:Wladek92","exists":true,"_BC_bools":["exists"]}},"id":887141},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" id=\"mwAQ\"\u003E\u003Cp id=\"mwAg\"\u003Ethe two targets of doclinks cannot be reached:\u003C/p\u003E\n\n\u003Cp id=\"mwAw\"\u003E\u003Cspan typeof=\"mw:Nowiki\" id=\"mwBA\"\u003E\u0026lt;!--T:161--\u0026gt; Use MediaWiki's validation/sanitization methods ''e.g.'' those in the \u0026lt;tvar name=1\u0026gt;{{class doclink|Html}}\u0026lt;/tvar\u0026gt; and \u0026lt;tvar name=2\u0026gt;{{class doclink|Sanitizer}}\u0026lt;/tvar\u0026gt; classes.\u003C/span\u003E\u003C/p\u003E\n\n\u003Cp id=\"mwBQ\"\u003Eplease correct or realign, thanks --\u003Ca href=\"/wiki/User:Wladek92\" title=\"User:Wladek92\" rel=\"mw:WikiLink\" id=\"mwBg\"\u003EChristian 🇫🇷 FR\u003C/a\u003E (\u003Ca href=\"/wiki/User_talk:Wladek92\" title=\"User talk:Wladek92\" rel=\"mw:WikiLink\" id=\"mwBw\"\u003Etalk\u003C/a\u003E) 10:33, 16 April 2024 (UTC)\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"y30g8almolxpfjcg","postId": "y30g8almopvrnnao","isMaxThreadingDepth":false,"creator":{"name":"Wladek92","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Wladek92","title":"Contributions/Wladek92","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Wladek92","title":"Wladek92","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Wladek92","title":"User talk:Wladek92","exists":true,"_BC_bools":["exists"]}},"id":887141},"isNewPage":true,"replies":[]},"y30hzy5ipwb02g46":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"y30g8almolxpfjcg","articleTitle":"Topic:Y30g8almolxpfjcg","revisionId":"y30hzy5ipwb02g46","timestamp":"20240416110506","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Y30g8almolxpfjcg","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026topic_showPostId=y30hzy5ipwb02g46#flow-post-y30hzy5ipwb02g46","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026topic_postId=y30hzy5ipwb02g46\u0026topic_revId=y30hzy5ipwb02g46\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"4"},"author":{"name":"TheDJ","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/TheDJ","title":"Contributions/TheDJ","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:TheDJ","title":"TheDJ","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:TheDJ","title":"User talk:TheDJ","exists":true,"_BC_bools":["exists"]}},"id":77414},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" id=\"mwAQ\"\u003E\u003Cp id=\"mwAg\"\u003Edone\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"y30g8almolxpfjcg","postId":"y30hzy5ipwb02g46","isMaxThreadingDepth" :false,"creator":{"name":"TheDJ","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/TheDJ","title":"Contributions/TheDJ","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:TheDJ","title":"TheDJ","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:TheDJ","title":"User talk:TheDJ","exists":true,"_BC_bools":["exists"]}},"id":77414},"isNewPage":false,"replies":[]},"wqvuu2axkjdp8uka":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wqvqvhgsvpu1je15","articleTitle":"Topic:Wqvqvhgsvpu1je15","revisionId":"wqvuu2axkjdp8uka","timestamp":"20220228155234","changeType":"edit-title","dateFormats":[],"properties":{"topic-of-post":{},"topic-of-post-text-from-html":{}},"isOriginalContent":false,"isModerated":false,"links":{"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15","title":"topic","text":"topic"}, "topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history","title":"History","text":"History"},"diff":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=compare-post-revisions\u0026topic_newRevision=wqvuu2axkjdp8uka","title":"diff","text":"diff"},"diff-prev":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=compare-post-revisions\u0026topic_newRevision=wqvuu2axkjdp8uka","title":"prev","text":"prev"},"topic-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_revId=wqvuu2axkjdp8uka\u0026action=single-view","title":"topic revision","text":"topic revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{ "reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=reply\u0026topic_postId=wqvqvhgsvpu1je15#flow-post-wqvqvhgsvpu1je15-form-content","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"34","new":"34"},"author":{"name":"Michael Große (WMDE)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Michael_Gro%C3%9Fe_(WMDE)","title":"Contributions/Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Michael_Gro%C3%9Fe_(WMDE)","title":"Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Michael_Gro%C3%9Fe_(WMDE)","title":"User talk:Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":16192811},"lastEditUser":{"name":"Michael Große (WMDE)","wiki":"mediawikiwiki","gender": "unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Michael_Gro%C3%9Fe_(WMDE)","title":"Contributions/Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Michael_Gro%C3%9Fe_(WMDE)","title":"Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Michael_Gro%C3%9Fe_(WMDE)","title":"User talk:Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":16192811},"lastEditId":"wqvuu2axkjdp8uka","previousRevisionId":"wqvqvhgsvrt2ng09","isLocked":false,"isModeratedNotLocked":false,"content":{"content":"Confusing A11y guideline about ids","format":"topic-title-html","plaintext":"Confusing A11y guideline about ids"},"watchable":false,"replyToId":null,"postId":"wqvqvhgsvpu1je15","isMaxThreadingDepth":false,"creator":{"name":"Michael Große (WMDE)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Michael_Gro%C3%9Fe_(WMDE)","title": "Contributions/Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Michael_Gro%C3%9Fe_(WMDE)","title":"Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Michael_Gro%C3%9Fe_(WMDE)","title":"User talk:Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":16192811},"isNewPage":false,"replies":["wqvqvhgsvts3rhzd","wqw6lnnhy3kgbuli","wqxfljr257j8ir7m","wqztx8tryinygmbs","wr01pzpsxubdhhxt","wr0ge8ldo1itlxrm","wr0h57cgmyhlw6ld","wr0i9fnl1dopx6we","wsm58zwb72uarhpw","wsm8iy6ptpmd8gii"],"reply_count":10,"last_updated_readable":"15:57, 28 March 2022","last_updated":1648483024000},"wqvqwjyk1u4y8hlo":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wqvqvhgsvpu1je15","articleTitle":"Topic:Wqvqvhgsvpu1je15","revisionId":"wqvqwjyk1u4y8hlo","timestamp":"20220228144159","changeType":"edit-post", "dateFormats":[],"properties":[],"isOriginalContent":false,"isModerated":false,"links":{"post-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history\u0026topic_postId=wqvqvhgsvts3rhzd","title":"History","text":"History"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_showPostId=wqvqvhgsvts3rhzd#flow-post-wqvqvhgsvts3rhzd","title":"post","text":"post"},"diff":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=compare-post-revisions\u0026topic_newRevision=wqvqwjyk1u4y8hlo","title":"diff","text":"diff"},"diff-prev":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=compare-post-revisions\u0026topic_newRevision=wqvqwjyk1u4y8hlo","title":"prev","text":"prev"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_postId=wqvqvhgsvts3rhzd\u0026topic_revId=wqvqwjyk1u4y8hlo\u0026action=single-view","title":"post revision","text":"post revision"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=reply\u0026topic_postId=wqvqvhgsvts3rhzd#flow-post-wqvqvhgsvts3rhzd","title":"Reply","text":"Reply"}},"size":{"old":"737","new":"735"},"author":{"name":"Michael Große (WMDE)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Michael_Gro%C3%9Fe_(WMDE)","title":"Contributions/Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Michael_Gro%C3%9Fe_(WMDE)","title":"Michael Große (WMDE)","exists":true,"_BC_bools":[ "exists"]},"talk":{"url":"/wiki/User_talk:Michael_Gro%C3%9Fe_(WMDE)","title":"User talk:Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":16192811},"lastEditUser":{"name":"Michael Große (WMDE)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Michael_Gro%C3%9Fe_(WMDE)","title":"Contributions/Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Michael_Gro%C3%9Fe_(WMDE)","title":"Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Michael_Gro%C3%9Fe_(WMDE)","title":"User talk:Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":16192811},"lastEditId":"wqvqwjyk1u4y8hlo","previousRevisionId":"wqvqvhgsvts3rhzd","isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,61,0,0]}\"\u003EI'm confused by this item in the section about Accessibility:\u003C/p\u003E\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[62,63,0,0]}\"\u003E\n\u003Cbr data-parsoid=\"{\u0026quot;dsr\u0026quot;:[63,63,0,0]}\"/\u003E\u003C/p\u003E\n\u003Cblockquote data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[64,280,12,13]}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[76,267,0,0]}\"\u003ESHOULD: HTML element's IDs should only be rarely, for things to which you can navigate. Everything else should be a class – even if you expect to use it only once, use a class name instead.\u003C/p\u003E\u003C/blockquote\u003E\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[281,502,0,0]}\"\u003E\n\u003Cbr data-parsoid=\"{\u0026quot;dsr\u0026quot;:[282,282,0,0]}\"/\u003E\nWhy would that be an accessibility consideration? Most accessibility uses for ids aren't related to navigation and can't be replaced by classes (for example, the target of an \u003Ccode data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[458,491,6,7]}\"\u003Earia-described-by=\"\"\u003C/code\u003E and such).\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[504,706,0,0]}\"\u003EI can see that ids should not be used for styling, but that is not an accessibility concern. And I can see that ids must be unique, but that is a MUST and also affects much more than only accessibility.\u003C/p\u003E\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[707,737,0,0]}\"\u003E\n\u003Cbr data-parsoid=\"{\u0026quot;dsr\u0026quot;:[708,708,0,0]}\"/\u003E\nAm I missing something here?\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wqvqvhgsvpu1je15","postId":"wqvqvhgsvts3rhzd","isMaxThreadingDepth":false,"creator":{"name":"Michael Große (WMDE)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Michael_Gro%C3%9Fe_(WMDE)","title":"Contributions/Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Michael_Gro%C3%9Fe_(WMDE)","title":"Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Michael_Gro%C3%9Fe_(WMDE)","title":"User talk:Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":16192811},"isNewPage":false,"replies":[]},"wqw6lnnhy3kgbuli":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wqvqvhgsvpu1je15","articleTitle":"Topic:Wqvqvhgsvpu1je15","revisionId":"wqw6lnnhy3kgbuli","timestamp":"20220228192351","changeType": "reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_showPostId=wqw6lnnhy3kgbuli#flow-post-wqw6lnnhy3kgbuli","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_postId=wqw6lnnhy3kgbuli\u0026topic_revId=wqw6lnnhy3kgbuli\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=unwatch","title":"Unwatch","text": "Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=reply\u0026topic_postId=wqw6lnnhy3kgbuli#flow-post-wqw6lnnhy3kgbuli","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"168"},"author":{"name":"TheDJ","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/TheDJ","title":"Contributions/TheDJ","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:TheDJ","title":"TheDJ","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:TheDJ","title":"User talk:TheDJ","exists":true,"_BC_bools":["exists"]}},"id":77414},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,168,0,0]}\"\u003ECorrect. however those should generally be auto-generated ids (again to guarantee uniqueness), but yes, this is more of a code convention than an accessibility concern.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wqvqvhgsvpu1je15","postId":"wqw6lnnhy3kgbuli","isMaxThreadingDepth":false,"creator":{"name":"TheDJ","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/TheDJ","title":"Contributions/TheDJ","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:TheDJ","title":"TheDJ","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:TheDJ","title":"User talk:TheDJ","exists":true,"_BC_bools":["exists"]}},"id":77414},"isNewPage":false,"replies":[]},"wqxfljr257j8ir7m":{"_BC_bools":["isOriginalContent","isModerated","isLocked", "isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wqvqvhgsvpu1je15","articleTitle":"Topic:Wqvqvhgsvpu1je15","revisionId":"wqxfljr257j8ir7m","timestamp":"20220301085150","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_showPostId=wqxfljr257j8ir7m#flow-post-wqxfljr257j8ir7m","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_postId=wqxfljr257j8ir7m\u0026topic_revId=wqxfljr257j8ir7m\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=reply\u0026topic_postId=wqxfljr257j8ir7m#flow-post-wqxfljr257j8ir7m","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"204"},"author":{"name":"AKlapper (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/AKlapper_(WMF)","title":"Contributions/AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:AKlapper_(WMF)","title":"AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url": "/wiki/User_talk:AKlapper_(WMF)","title":"User talk:AKlapper (WMF)","exists":true,"_BC_bools":["exists"]}},"id":790805},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,204,0,0]}\"\u003EI'd generally like to remove all content under \u003Ca href=\"/wiki/Best_practices_for_extensions#Accessibility\" title=\"Best practices for extensions\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Best_practices_for_extensions#Accessibility\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;Best practices for extensions#Accessibility\u0026quot;},\u0026quot;dsr\u0026quot;:[47,94,2,2]}\"\u003EBest practices for extensions#Accessibility\u003C/a\u003E and instead link to \u003Ca href=\"/wiki/Accessibility_guide_for_developers\" title=\"Accessibility guide for developers\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Accessibility_guide_for_developers\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;Accessibility guide for developers\u0026quot;},\u0026quot;dsr\u0026quot;:[115,153,2,2]}\"\u003EAccessibility guide for developers\u003C/a\u003E to avoid quadruplicating more and more guidelines.\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wqvqvhgsvpu1je15","postId":"wqxfljr257j8ir7m","isMaxThreadingDepth":false,"creator":{"name":"AKlapper (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/AKlapper_(WMF)","title":"Contributions/AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:AKlapper_(WMF)","title":"AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:AKlapper_(WMF)","title":"User talk:AKlapper (WMF)","exists":true,"_BC_bools":["exists"]}},"id":790805},"isNewPage":false,"replies":[]},"wqztxig8eov8d5gw":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wqvqvhgsvpu1je15","articleTitle":"Topic:Wqvqvhgsvpu1je15","revisionId":"wqztxig8eov8d5gw","timestamp":"20220302104203","changeType":"edit-post","dateFormats":[],"properties":[],"isOriginalContent" :false,"isModerated":false,"links":{"post-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history\u0026topic_postId=wqztx8tryinygmbs","title":"History","text":"History"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_showPostId=wqztx8tryinygmbs#flow-post-wqztx8tryinygmbs","title":"post","text":"post"},"diff":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=compare-post-revisions\u0026topic_newRevision=wqztxig8eov8d5gw","title":"diff","text":"diff"},"diff-prev":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=compare-post-revisions\u0026topic_newRevision=wqztxig8eov8d5gw","title":"prev","text":"prev"}, "post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_postId=wqztx8tryinygmbs\u0026topic_revId=wqztxig8eov8d5gw\u0026action=single-view","title":"post revision","text":"post revision"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=reply\u0026topic_postId=wqztx8tryinygmbs#flow-post-wqztx8tryinygmbs","title":"Reply","text":"Reply"}},"size":{"old":"75","new":"74"},"author":{"name":"Michael Große (WMDE)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Michael_Gro%C3%9Fe_(WMDE)","title":"Contributions/Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Michael_Gro%C3%9Fe_(WMDE)","title":"Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Michael_Gro%C3%9Fe_(WMDE)","title":"User talk:Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":16192811}, "lastEditUser":{"name":"Michael Große (WMDE)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Michael_Gro%C3%9Fe_(WMDE)","title":"Contributions/Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Michael_Gro%C3%9Fe_(WMDE)","title":"Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Michael_Gro%C3%9Fe_(WMDE)","title":"User talk:Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":16192811},"lastEditId":"wqztxig8eov8d5gw","previousRevisionId":"wqztx8tryinygmbs","isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,74,0,0]}\"\u003E\u003Cspan about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{\u0026quot;pi\u0026quot;:[[{\u0026quot;k\u0026quot;:\u0026quot;1\u0026quot;}]],\u0026quot;dsr\u0026quot;:[0,30,null,null]}\" data-mw=\"{\u0026quot;parts\u0026quot;:[{\u0026quot;template\u0026quot;:{\u0026quot;target\u0026quot;:{\u0026quot;wt\u0026quot;:\u0026quot;FlowMention\u0026quot;,\u0026quot;href\u0026quot;:\u0026quot;./Template:FlowMention\u0026quot;},\u0026quot;params\u0026quot;:{\u0026quot;1\u0026quot;:{\u0026quot;wt\u0026quot;:\u0026quot;AKlapper (WMF)\u0026quot;}},\u0026quot;i\u0026quot;:0}}]}\"\u003E@\u003C/span\u003E\u003Ca href=\"/wiki/User:AKlapper_(WMF)\" title=\"User:AKlapper (WMF)\" rel=\"mw:WikiLink\" about=\"#mwt1\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;piped\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./User:AKlapper_(WMF)\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;User:AKlapper (WMF)\u0026quot;}}\"\u003EAKlapper (WMF)\u003C/a\u003E That sounds like a sensible approach to me.\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wqvqvhgsvpu1je15","postId":"wqztx8tryinygmbs","isMaxThreadingDepth":false,"creator":{"name":"Michael Große (WMDE)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Michael_Gro%C3%9Fe_(WMDE)","title":"Contributions/Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Michael_Gro%C3%9Fe_(WMDE)","title":"Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Michael_Gro%C3%9Fe_(WMDE)","title":"User talk:Michael Große (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":16192811},"isNewPage":false,"replies":[]},"wr01pzpsxubdhhxt":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wqvqvhgsvpu1je15","articleTitle":"Topic:Wqvqvhgsvpu1je15","revisionId":"wr01pzpsxubdhhxt","timestamp":"20220302130157","changeType": "reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_showPostId=wr01pzpsxubdhhxt#flow-post-wr01pzpsxubdhhxt","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_postId=wr01pzpsxubdhhxt\u0026topic_revId=wr01pzpsxubdhhxt\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=unwatch","title":"Unwatch","text": "Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=reply\u0026topic_postId=wr01pzpsxubdhhxt#flow-post-wr01pzpsxubdhhxt","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"5"},"author":{"name":"AKlapper (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/AKlapper_(WMF)","title":"Contributions/AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:AKlapper_(WMF)","title":"AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:AKlapper_(WMF)","title":"User talk:AKlapper (WMF)","exists":true,"_BC_bools":["exists"]}},"id":790805},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked": false,"isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,5,0,0]}\"\u003EDone.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wqvqvhgsvpu1je15","postId":"wr01pzpsxubdhhxt","isMaxThreadingDepth":false,"creator":{"name":"AKlapper (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/AKlapper_(WMF)","title":"Contributions/AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:AKlapper_(WMF)","title":"AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:AKlapper_(WMF)","title":"User talk:AKlapper (WMF)","exists":true,"_BC_bools":["exists"]}},"id":790805},"isNewPage":false,"replies":[]},"wr0ge8ldo1itlxrm":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable", "isMaxThreadingDepth","isNewPage"],"workflowId":"wqvqvhgsvpu1je15","articleTitle":"Topic:Wqvqvhgsvpu1je15","revisionId":"wr0ge8ldo1itlxrm","timestamp":"20220302172526","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_showPostId=wr0ge8ldo1itlxrm#flow-post-wr0ge8ldo1itlxrm","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_postId=wr0ge8ldo1itlxrm\u0026topic_revId=wr0ge8ldo1itlxrm\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=reply\u0026topic_postId=wr0ge8ldo1itlxrm#flow-post-wr0ge8ldo1itlxrm","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"256"},"author":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{ "url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,256,0,0]}\"\u003EBut none of that is written in terms of should/must, so now we're adding a fudge factor back into the process, whereas this entire document is meant to be a \"one-stop-shop\" where if you pass all the items you can be pretty sure you could as 'best practice.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wqvqvhgsvpu1je15","postId":"wr0ge8ldo1itlxrm","isMaxThreadingDepth":false,"creator":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url": "/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"isNewPage":false,"replies":[]},"wr0h57cgmyhlw6ld":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wqvqvhgsvpu1je15","articleTitle":"Topic:Wqvqvhgsvpu1je15","revisionId":"wr0h57cgmyhlw6ld","timestamp":"20220302173853","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history","title":"History","text":"History"},"topic":{"url": "//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_showPostId=wr0h57cgmyhlw6ld#flow-post-wr0h57cgmyhlw6ld","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_postId=wr0h57cgmyhlw6ld\u0026topic_revId=wr0h57cgmyhlw6ld\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=reply\u0026topic_postId=wr0h57cgmyhlw6ld#flow-post-wr0h57cgmyhlw6ld","title":"Reply","text":"Reply"},"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"99"},"author":{"name":"AKlapper (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/AKlapper_(WMF)","title":"Contributions/AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:AKlapper_(WMF)","title":"AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:AKlapper_(WMF)","title":"User talk:AKlapper (WMF)","exists":true,"_BC_bools":["exists"]}},"id":790805},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,99,0,0]}\"\u003E\u003Cspan about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{\u0026quot;pi\u0026quot;:[[{\u0026quot;k\u0026quot;:\u0026quot;1\u0026quot;}]],\u0026quot;dsr\u0026quot;:[0,33,null,null]}\" data-mw=\"{\u0026quot;parts\u0026quot;:[{\u0026quot;template\u0026quot;:{\u0026quot;target\u0026quot;:{\u0026quot;wt\u0026quot;:\u0026quot;FlowMention\u0026quot;,\u0026quot;href\u0026quot;:\u0026quot;./Template:FlowMention\u0026quot;},\u0026quot;params\u0026quot;:{\u0026quot;1\u0026quot;:{\u0026quot;wt\u0026quot;:\u0026quot;Jdforrester (WMF)\u0026quot;}},\u0026quot;i\u0026quot;:0}}]}\"\u003E@\u003C/span\u003E\u003Ca href=\"/wiki/User:Jdforrester_(WMF)\" title=\"User:Jdforrester (WMF)\" rel=\"mw:WikiLink\" about=\"#mwt1\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;piped\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./User:Jdforrester_(WMF)\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;User:Jdforrester (WMF)\u0026quot;}}\"\u003EJdforrester (WMF)\u003C/a\u003E Please feel free to edit it and define MUSTs and SHOULDs. Thanks!\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wqvqvhgsvpu1je15","postId":"wr0h57cgmyhlw6ld","isMaxThreadingDepth":false,"creator":{"name":"AKlapper (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/AKlapper_(WMF)","title":"Contributions/AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:AKlapper_(WMF)","title":"AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:AKlapper_(WMF)","title":"User talk:AKlapper (WMF)","exists":true,"_BC_bools":["exists"]}},"id":790805},"isNewPage":false,"replies":[]},"wr0i9fnl1dopx6we":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wqvqvhgsvpu1je15","articleTitle":"Topic:Wqvqvhgsvpu1je15","revisionId":"wr0i9fnl1dopx6we","timestamp":"20220302175857","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent": true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_showPostId=wr0i9fnl1dopx6we#flow-post-wr0i9fnl1dopx6we","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_postId=wr0i9fnl1dopx6we\u0026topic_revId=wr0i9fnl1dopx6we\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=reply\u0026topic_postId=wr0i9fnl1dopx6we#flow-post-wr0i9fnl1dopx6we","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"64"},"author":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false, "isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,64,0,0]}\"\u003EI'd rather you did that, as the editor of this area here, Andre.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wqvqvhgsvpu1je15","postId":"wr0i9fnl1dopx6we","isMaxThreadingDepth":false,"creator":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"isNewPage":false,"replies":[]},"wsm58zwb72uarhpw":{"_BC_bools":["isOriginalContent","isModerated" ,"isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wqvqvhgsvpu1je15","articleTitle":"Topic:Wqvqvhgsvpu1je15","revisionId":"wsm58zwb72uarhpw","timestamp":"20220328145814","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_showPostId=wsm58zwb72uarhpw#flow-post-wsm58zwb72uarhpw","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_postId=wsm58zwb72uarhpw\u0026topic_revId=wsm58zwb72uarhpw\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=reply\u0026topic_postId=wsm58zwb72uarhpw#flow-post-wsm58zwb72uarhpw","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"99"},"author":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{ "url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,99,0,0]}\"\u003EOK, it's been a month, we can just revert your removal Andre if you don't have time to do the work?\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wqvqvhgsvpu1je15","postId":"wsm58zwb72uarhpw","isMaxThreadingDepth":false,"creator":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url": "/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"isNewPage":false,"replies":[]},"wsm8iy6ptpmd8gii":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wqvqvhgsvpu1je15","articleTitle":"Topic:Wqvqvhgsvpu1je15","revisionId":"wsm8iy6ptpmd8gii","timestamp":"20220328155704","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15","title":"topic","text":"topic"},"post":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_showPostId=wsm8iy6ptpmd8gii#flow-post-wsm8iy6ptpmd8gii","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026topic_postId=wsm8iy6ptpmd8gii\u0026topic_revId=wsm8iy6ptpmd8gii\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=reply\u0026topic_postId=wqvqvhgsvpu1je15#flow-post-wqvqvhgsvpu1je15","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15\u0026action=edit-topic-summary","title":"Summarize", "text":"Summarize"}},"size":{"old":"0","new":"256"},"author":{"name":"AKlapper (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/AKlapper_(WMF)","title":"Contributions/AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:AKlapper_(WMF)","title":"AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:AKlapper_(WMF)","title":"User talk:AKlapper (WMF)","exists":true,"_BC_bools":["exists"]}},"id":790805},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,256,0,0]}\"\u003ESurely we can duplicate content (and likely make things go out of sync), however I don't think it's a good idea when there are already guidelines for an area to add yet another place with guidelines for that area. For the time being, feel free to go ahead.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wqvqvhgsvpu1je15","postId":"wsm8iy6ptpmd8gii","isMaxThreadingDepth":false,"creator":{"name":"AKlapper (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/AKlapper_(WMF)","title":"Contributions/AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:AKlapper_(WMF)","title":"AKlapper (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:AKlapper_(WMF)","title":"User talk:AKlapper (WMF)","exists":true,"_BC_bools":[ "exists"]}},"id":790805},"isNewPage":false,"replies":[]},"wr0i8lkz6xc02097":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"ur1vlumaj7yboynl","articleTitle":"Topic:Ur1vlumaj7yboynl","revisionId":"wr0i8lkz6xc02097","timestamp":"20220302175832","changeType":"lock-topic","dateFormats":[],"properties":{"topic-of-post":{},"topic-of-post-text-from-html":{}},"isOriginalContent":true,"isModerated":true,"links":{"topic":{"url":"//www.mediawiki.org/wiki/Topic:Ur1vlumaj7yboynl","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=history","title":"History","text":"History"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=unwatch","title" :"Unwatch","text":"Unwatch"},"topic-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026topic_revId=wr0i8lkz6xc02097\u0026action=single-view","title":"topic revision","text":"topic revision"}},"actions":[],"size":{"old":"47","new":"47"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":"ur1vlumaj9xct0mp","moderator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle", "exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"moderateState":"lock","moderateReason":{"content":"marked as resolved","format":"plaintext"},"isLocked":true,"isModeratedNotLocked":false,"content":{"content":"Rating for \u0026quot;uninstallation maintenance scripts\u0026quot;","format":"topic-title-html","plaintext":"Rating for \"uninstallation maintenance scripts\""},"summary":{"revision":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked"],"workflowId":"ur1vlumaj7yboynl","articleTitle":"Topic:Ur1vlumaj7yboynl","revisionId":"wr0i8qe6j28qaslj","timestamp":"20220302175836","changeType":"create-topic-summary","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic":{"url": "//www.mediawiki.org/wiki/Topic:Ur1vlumaj7yboynl","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=history","title":"History","text":"History"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=unwatch","title":"Unwatch","text":"Unwatch"},"summary-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026topicsummary_revId=wr0i8qe6j28qaslj\u0026action=view-topic-summary","title":"summary revision","text":"summary revision"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"5"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{ "url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,5,0,0]}\"\u003EDone.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"creator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true, "_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822}}},"watchable":false,"replyToId":null,"postId":"ur1vlumaj7yboynl","isMaxThreadingDepth":false,"creator":{"name":"SamanthaNguyen","wiki":"mediawikiwiki","gender":"female","links":{"contribs":{"url":"/wiki/Special:Contributions/SamanthaNguyen","title":"Contributions/SamanthaNguyen","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:SamanthaNguyen","title":"SamanthaNguyen","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:SamanthaNguyen","title":"User talk:SamanthaNguyen","exists":true,"_BC_bools":["exists"]}},"id":1336174},"isNewPage":false,"replies":["ur1vlumajbwdx2lt","wovcw3sx8052esva"],"reply_count":2,"last_updated_readable":"17:58, 2 March 2022","last_updated":1646243912000},"ur1vlumajbwdx2lt":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable", "isMaxThreadingDepth","isNewPage"],"workflowId":"ur1vlumaj7yboynl","articleTitle":"Topic:Ur1vlumaj7yboynl","revisionId":"ur1vlumajbwdx2lt","timestamp":"20181225185841","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Ur1vlumaj7yboynl","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026topic_showPostId=ur1vlumajbwdx2lt#flow-post-ur1vlumajbwdx2lt","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026topic_postId=ur1vlumajbwdx2lt\u0026topic_revId=ur1vlumajbwdx2lt\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"121"},"author":{"name":"SamanthaNguyen","wiki":"mediawikiwiki","gender":"female","links":{"contribs":{"url":"/wiki/Special:Contributions/SamanthaNguyen","title":"Contributions/SamanthaNguyen","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:SamanthaNguyen","title":"SamanthaNguyen","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:SamanthaNguyen","title":"User talk:SamanthaNguyen","exists":true,"_BC_bools":["exists"]}},"id":1336174},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null} ,"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,121,0,0]}\"\u003EThere's no rating for this item under the Database section. Is it something that must be done, should be, or recommended?\u003C/p\u003E","format":"fixed-html"},"watchable":false,"replyToId":"ur1vlumaj7yboynl","postId":"ur1vlumajbwdx2lt","isMaxThreadingDepth":false,"creator":{"name":"SamanthaNguyen","wiki":"mediawikiwiki","gender":"female","links":{"contribs":{"url":"/wiki/Special:Contributions/SamanthaNguyen","title":"Contributions/SamanthaNguyen","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:SamanthaNguyen","title":"SamanthaNguyen","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:SamanthaNguyen","title":"User talk:SamanthaNguyen","exists":true,"_BC_bools":["exists"]}},"id":1336174},"isNewPage":true,"replies":[]},"wovcw3sx8052esva":{"_BC_bools":["isOriginalContent" ,"isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"ur1vlumaj7yboynl","articleTitle":"Topic:Ur1vlumaj7yboynl","revisionId":"wovcw3sx8052esva","timestamp":"20220127024725","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Ur1vlumaj7yboynl","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026topic_showPostId=wovcw3sx8052esva#flow-post-wovcw3sx8052esva","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026topic_postId=wovcw3sx8052esva\u0026topic_revId=wovcw3sx8052esva\u0026action=single-view","title":"post revision","text":"post revision"}, "watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"580"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null, "previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,580,0,0]}\"\u003EI didn't see this at the time, but I added \"should\" in front of it last year in \u003Ca rel=\"mw:ExtLink\" href=\"https://www.mediawiki.org/w/index.php?title=Best_practices_for_extensions\u0026amp;diff=prev\u0026amp;oldid=4900262\" class=\"external text\" data-parsoid=\"{\u0026quot;dsr\u0026quot;:[80,189,99,1]}\"\u003Ethis edit\u003C/a\u003E as part of a general formatting copy-fix. I didn't intentionally make a choice there. I've changed it to \"optional\" now because 1) This is something virtually no extension does today so it seems only right to begin there given that these are meant to reflect current practice, and 2) There is a related item about uninstall instructions under \"Documentation\" which is also optional already.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"ur1vlumaj7yboynl","postId": "wovcw3sx8052esva","isMaxThreadingDepth":false,"creator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"isNewPage":false,"replies":[]},"wr0i74njq3y2nho2":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uxot1wc2nefkjbwo","articleTitle":"Topic:Uxot1wc2nefkjbwo","revisionId":"wr0i74njq3y2nho2","timestamp":"20220302175748","changeType":"lock-topic","dateFormats":[],"properties":{"topic-of-post":{},"topic-of-post-text-from-html":{}},"isOriginalContent":true,"isModerated":true,"links":{"topic":{"url": "//www.mediawiki.org/wiki/Topic:Uxot1wc2nefkjbwo","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=history","title":"History","text":"History"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=unwatch","title":"Unwatch","text":"Unwatch"},"topic-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026topic_revId=wr0i74njq3y2nho2\u0026action=single-view","title":"topic revision","text":"topic revision"}},"actions":[],"size":{"old":"18","new":"18"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle" ,"exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":"uxot1wc2ngelndvs","moderator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"moderateState":"lock","moderateReason":{"content":"marked as resolved","format":"plaintext"},"isLocked":true,"isModeratedNotLocked":false,"content":{"content":"Avoid global state","format":"topic-title-html","plaintext":"Avoid global state"},"summary":{"revision":{"_BC_bools":[ "isOriginalContent","isModerated","isLocked","isModeratedNotLocked"],"workflowId":"uxot1wc2nefkjbwo","articleTitle":"Topic:Uxot1wc2nefkjbwo","revisionId":"wr0i7ea026f8ntek","timestamp":"20220302175756","changeType":"create-topic-summary","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uxot1wc2nefkjbwo","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=history","title":"History","text":"History"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=unwatch","title":"Unwatch","text":"Unwatch"},"summary-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026topicsummary_revId=wr0i7ea026f8ntek\u0026action=view-topic-summary" ,"title":"summary revision","text":"summary revision"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"6"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,6,0,0]}\"\u003EAdded.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"creator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822}}},"watchable":false,"replyToId":null,"postId":"uxot1wc2nefkjbwo","isMaxThreadingDepth":false,"creator":{"name":"Smalyshev (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Smalyshev_(WMF)","title":"Contributions/Smalyshev (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Smalyshev_(WMF)","title": "Smalyshev (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Smalyshev_(WMF)","title":"User talk:Smalyshev (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1934232},"isNewPage":false,"replies":["uxot1wc2nidmrfuw","uzc3sc6z23ylkzdo","wr0i728xgpgozp40"],"reply_count":3,"last_updated_readable":"17:57, 2 March 2022","last_updated":1646243868000},"uxot1wc2nidmrfuw":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uxot1wc2nefkjbwo","articleTitle":"Topic:Uxot1wc2nefkjbwo","revisionId":"uxot1wc2nidmrfuw","timestamp":"20190412010934","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uxot1wc2nefkjbwo","title":"topic", "text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026topic_showPostId=uxot1wc2nidmrfuw#flow-post-uxot1wc2nidmrfuw","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026topic_postId=uxot1wc2nidmrfuw\u0026topic_revId=uxot1wc2nidmrfuw\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"426"},"author":{"name":"Smalyshev (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url": "/wiki/Special:Contributions/Smalyshev_(WMF)","title":"Contributions/Smalyshev (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Smalyshev_(WMF)","title":"Smalyshev (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Smalyshev_(WMF)","title":"User talk:Smalyshev (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1934232},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,426,0,0]}\"\u003EOne thing that should be avoided even more than global state (e.g. global variables/public static properties in classes) is local static vars and similar instances of hidden local state, especially when used for caching. It looks like a very good idea when writing it, and is absolute nightmare when debugging/testing, because it creates hidden un-clearable state which could be in any random configuration when you get to it.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uxot1wc2nefkjbwo","postId":"uxot1wc2nidmrfuw","isMaxThreadingDepth":false,"creator":{"name":"Smalyshev (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Smalyshev_(WMF)","title":"Contributions/Smalyshev (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Smalyshev_(WMF)", "title":"Smalyshev (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Smalyshev_(WMF)","title":"User talk:Smalyshev (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1934232},"isNewPage":true,"replies":[]},"uzc3sc6z23ylkzdo":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uxot1wc2nefkjbwo","articleTitle":"Topic:Uxot1wc2nefkjbwo","revisionId":"uzc3sc6z23ylkzdo","timestamp":"20190508160141","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uxot1wc2nefkjbwo","title":"topic","text":"topic"},"post":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026topic_showPostId=uzc3sc6z23ylkzdo#flow-post-uzc3sc6z23ylkzdo","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026topic_postId=uzc3sc6z23ylkzdo\u0026topic_revId=uzc3sc6z23ylkzdo\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"144"},"author":{"name":"Thiemo Kreuz (WMDE)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url": "/wiki/Special:Contributions/Thiemo_Kreuz_(WMDE)","title":"Contributions/Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Thiemo_Kreuz_(WMDE)","title":"Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Thiemo_Kreuz_(WMDE)","title":"User talk:Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":1318738},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,144,0,0]}\"\u003EThere is an other document in the works at \u003Ca href=\"/wiki/User:DKinzler_(WMF)/Software_Design_Practices\" title=\"User:DKinzler (WMF)/Software Design Practices\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./User:DKinzler_(WMF)/Software_Design_Practices\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;User:DKinzler (WMF)/Software Design Practices\u0026quot;},\u0026quot;dsr\u0026quot;:[43,92,2,2]}\"\u003EUser:DKinzler (WMF)/Software Design Practices\u003C/a\u003E that covers exactly this concern very well, I find.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uxot1wc2nefkjbwo","postId":"uzc3sc6z23ylkzdo","isMaxThreadingDepth":false,"creator":{"name":"Thiemo Kreuz (WMDE)", "wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Thiemo_Kreuz_(WMDE)","title":"Contributions/Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Thiemo_Kreuz_(WMDE)","title":"Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Thiemo_Kreuz_(WMDE)","title":"User talk:Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":1318738},"isNewPage":false,"replies":[]},"wr0i728xgpgozp40":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uxot1wc2nefkjbwo","articleTitle":"Topic:Uxot1wc2nefkjbwo","revisionId":"wr0i728xgpgozp40","timestamp":"20220302175746","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=history" ,"title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uxot1wc2nefkjbwo","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026topic_showPostId=wr0i728xgpgozp40#flow-post-wr0i728xgpgozp40","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026topic_postId=wr0i728xgpgozp40\u0026topic_revId=wr0i728xgpgozp40\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new": "178"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,178,0,0]}\"\u003EI've made the point about global state explicit in \u003Ca rel=\"mw:ExtLink\" href=\"https://www.mediawiki.org/w/index.php?title=Best_practices_for_extensions\u0026amp;type=revision\u0026amp;diff=5091662\u0026amp;oldid=5091658\" class=\"external text\" data-parsoid=\"{\u0026quot;dsr\u0026quot;:[51,177,116,1]}\"\u003Ethis edit\u003C/a\u003E.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uxot1wc2nefkjbwo","postId":"wr0i728xgpgozp40","isMaxThreadingDepth":false,"creator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title": "User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"isNewPage":false,"replies":[]},"wovr2kq9nqewvr5a":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wovr2kqb7qwhztwu","articleTitle":"Topic:Wovr2kqb7qwhztwu","revisionId":"wovr2kq9nqewvr5a","timestamp":"20220127070202","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wovr2kqb7qwhztwu","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_showPostId=wovr2kq9nqewvr5a#flow-post-wovr2kq9nqewvr5a","title":"post","text":"post"},"post-revision":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_postId=wovr2kq9nqewvr5a\u0026topic_revId=wovr2kq9nqewvr5a\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=reply\u0026topic_postId=wovr2kq9nqewvr5a#flow-post-wovr2kq9nqewvr5a","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"997"},"author":{"name":"Dinoguy1000","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url": "/wiki/Special:Contributions/Dinoguy1000","title":"Contributions/Dinoguy1000","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Dinoguy1000","title":"Dinoguy1000","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Dinoguy1000","title":"User talk:Dinoguy1000","exists":true,"_BC_bools":["exists"]}},"id":32187},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,723,0,0]}\"\u003EFrom the name and (extremely minimal) lede, it sounds like this page is making recommendations for \u003Ci data-parsoid=\"{\u0026quot;dsr\u0026quot;:[99,106,2,2]}\"\u003Eall\u003C/i\u003E extensions. However, from the very first recommendation, it's clear that the intended scope is only extensions that are meant to be used generally, and especially those aiming for WMF deployment. This disconnect could lead readers to believe that an extension being developed exclusively for use on e.g. a single third-party wiki is either explicitly discouraged, or has to jump through unexpected hoops that implicitly discourage development of such extensions. I'm sure that such extensions shouldn't be \u003Ci data-parsoid=\"{\u0026quot;dsr\u0026quot;:[613,627,2,2]}\"\u003Eencouraged\u003C/i\u003E, but I think it's a mistake to actually discourage their creation/use, explicitly or otherwise.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[725,997,0,0]}\"\u003Etl;dr This page's lede should be expanded to clarify what sorts of extensions it's intended for: \u003Ci data-parsoid=\"{\u0026quot;dsr\u0026quot;:[822,829,2,2]}\"\u003Eall\u003C/i\u003E extensions, or only those intended for use outside of their originating communities/wikis. (Possibly individual recommendations should receive similar clarifications.)\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wovr2kqb7qwhztwu","postId":"wovr2kq9nqewvr5a","isMaxThreadingDepth":false,"creator":{"name":"Dinoguy1000","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Dinoguy1000","title":"Contributions/Dinoguy1000","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Dinoguy1000","title":"Dinoguy1000","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Dinoguy1000","title":"User talk:Dinoguy1000","exists":true,"_BC_bools":["exists"]}},"id":32187},"isNewPage":true,"replies":[]},"wovr2kqb7svj3vvy":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wovr2kqb7qwhztwu","articleTitle":"Topic:Wovr2kqb7qwhztwu","revisionId":"wovr2kqb7svj3vvy","timestamp":"20220127070202","changeType":"new-post","dateFormats":[],"properties":{"topic-of-post":{}, "topic-of-post-text-from-html":{}},"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wovr2kqb7qwhztwu","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_showPostId=wovr2kqb7qwhztwu#flow-post-wovr2kqb7qwhztwu","title":"post","text":"post"},"topic-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_revId=wovr2kqb7svj3vvy\u0026action=single-view","title":"topic revision","text":"topic revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=reply\u0026topic_postId=wovr2kqb7qwhztwu#flow-post-wovr2kqb7qwhztwu-form-content","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"26"},"author":{"name":"Dinoguy1000","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Dinoguy1000","title":"Contributions/Dinoguy1000","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Dinoguy1000","title":"Dinoguy1000","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Dinoguy1000","title":"User talk:Dinoguy1000","exists":true,"_BC_bools":["exists"]}},"id":32187},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{ "content":"What is this page\u0026#039;s scope?","format":"topic-title-html","plaintext":"What is this page's scope?"},"watchable":false,"replyToId":null,"postId":"wovr2kqb7qwhztwu","isMaxThreadingDepth":false,"creator":{"name":"Dinoguy1000","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Dinoguy1000","title":"Contributions/Dinoguy1000","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Dinoguy1000","title":"Dinoguy1000","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Dinoguy1000","title":"User talk:Dinoguy1000","exists":true,"_BC_bools":["exists"]}},"id":32187},"isNewPage":false,"replies":["wovr2kq9nqewvr5a","wovsb0lv4cczkjla","wovwygetm6d1xeqt","wovzkhex07e59vbi","wows6m2id6uya1tb"],"reply_count":8,"last_updated_readable":"17:39, 4 February 2022","last_updated":1643996381000},"wovsb0lv4cczkjla":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched", "watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wovr2kqb7qwhztwu","articleTitle":"Topic:Wovr2kqb7qwhztwu","revisionId":"wovsb0lv4cczkjla","timestamp":"20220127072412","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wovr2kqb7qwhztwu","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_showPostId=wovsb0lv4cczkjla#flow-post-wovsb0lv4cczkjla","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_postId=wovsb0lv4cczkjla\u0026topic_revId=wovsb0lv4cczkjla\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=reply\u0026topic_postId=wovsb0lv4cczkjla#flow-post-wovsb0lv4cczkjla","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"652"},"author":{"name":"Legoktm","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Legoktm","title":"Contributions/Legoktm","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Legoktm","title":"Legoktm","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Legoktm","title": "User talk:Legoktm","exists":true,"_BC_bools":["exists"]}},"id":31711},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,309,0,0]}\"\u003EThe document is intended for all extensions, but I think it is worth recognizing that while something is universally a best practice, it may not be applicable for specific extensions. For example, disabling the parser cache is not a good thing, but some extensions do it, and that's okay for how they're used.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[311,652,0,0]}\"\u003EThe first recommendation is \"Use the standard \u003Ca href=\"/wiki/Bug_management\" title=\"Bug management\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;piped\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Bug_management\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;Bug management\u0026quot;},\u0026quot;dsr\u0026quot;:[357,389,17,2]}\"\u003Eissue tracker\u003C/a\u003E\". I don't understand why you think that's specific to WMF deployment. In general, having MediaWiki extensions track bugs in Phabricator and use Gerrit (eventually GitLab) for code review should be considered a best practice, given all the benefits from doing so.\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wovr2kqb7qwhztwu","postId":"wovsb0lv4cczkjla","isMaxThreadingDepth":false,"creator":{"name":"Legoktm","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Legoktm","title":"Contributions/Legoktm","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Legoktm","title":"Legoktm","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Legoktm","title":"User talk:Legoktm","exists":true,"_BC_bools":["exists"]}},"id":31711},"isNewPage":false,"replies":[]},"wovx1zx5l41y8roq":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wovr2kqb7qwhztwu","articleTitle":"Topic:Wovr2kqb7qwhztwu","revisionId":"wovx1zx5l41y8roq","timestamp":"20220127084929","changeType":"edit-post","dateFormats":[],"properties":[],"isOriginalContent":false,"isModerated":false,"links":{"post-history":{ "url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=history\u0026topic_postId=wovwygetm6d1xeqt","title":"History","text":"History"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wovr2kqb7qwhztwu","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_showPostId=wovwygetm6d1xeqt#flow-post-wovwygetm6d1xeqt","title":"post","text":"post"},"diff":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=compare-post-revisions\u0026topic_newRevision=wovx1zx5l41y8roq","title":"diff","text":"diff"},"diff-prev":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=compare-post-revisions\u0026topic_newRevision=wovx1zx5l41y8roq","title":"prev","text":"prev"},"post-revision":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_postId=wovwygetm6d1xeqt\u0026topic_revId=wovx1zx5l41y8roq\u0026action=single-view","title":"post revision","text":"post revision"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=reply\u0026topic_postId=wovwygetm6d1xeqt#flow-post-wovwygetm6d1xeqt","title":"Reply","text":"Reply"}},"size":{"old":"801","new":"798"},"author":{"name":"Izno","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Izno","title":"Contributions/Izno","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Izno","title":"Izno","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Izno","title":"User talk:Izno","exists":true,"_BC_bools":["exists"]}},"id":25850},"lastEditUser":{"name":"Izno","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Izno","title":"Contributions/Izno", "exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Izno","title":"Izno","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Izno","title":"User talk:Izno","exists":true,"_BC_bools":["exists"]}},"id":25850},"lastEditId":"wovx1zx5l41y8roq","previousRevisionId":"wovwz22c62tsapss","isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,604,0,0]}\"\u003ENot all MediaWiki wikis are owned/operated by/as public, FLOSS, and/or not-for-profit. Accordingly, all MUSTs are at best OPTIONALs for basically obvious reasons n.b. it's not reasonable to expect a private company with likely different expectations of licensing (the polar opposite of those three values, so the other end of the spectrum) to comply with \"publish on WMF Gerrit\" and \"use WMF Phabricator\" and \"use PSR-4\" and \"localize\" and etc. For example, even two other organizations that are reasonably 'open' and in a topical sphere to WMF (Miraheze, Fandom) don't do every one of those MUST things.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[606,798,0,0]}\"\u003ESo, I agree that the scope should be clear, as should be the expectations associated with \u003Cem about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[696,706,null,null],\u0026quot;pi\u0026quot;:[[{\u0026quot;k\u0026quot;:\u0026quot;1\u0026quot;}]]}\" data-mw=\"{\u0026quot;parts\u0026quot;:[{\u0026quot;template\u0026quot;:{\u0026quot;target\u0026quot;:{\u0026quot;wt\u0026quot;:\u0026quot;em\u0026quot;,\u0026quot;href\u0026quot;:\u0026quot;./Template:Em\u0026quot;},\u0026quot;params\u0026quot;:{\u0026quot;1\u0026quot;:{\u0026quot;wt\u0026quot;:\u0026quot;not\u0026quot;}},\u0026quot;i\u0026quot;:0}}]}\"\u003Enot\u003C/em\u003E developing with the requirements, objectives, and best practice as documented here in mind.\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wovr2kqb7qwhztwu","postId":"wovwygetm6d1xeqt","isMaxThreadingDepth":false,"creator":{"name":"Izno","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Izno","title":"Contributions/Izno","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Izno","title":"Izno","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Izno","title":"User talk:Izno","exists":true,"_BC_bools":["exists"]}},"id":25850},"isNewPage":false,"replies":["wpdnhzjvkqs13tew","wpek4xn1zz31dbj7"]},"wovzkhex07e59vbi":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wovr2kqb7qwhztwu","articleTitle":"Topic:Wovr2kqb7qwhztwu","revisionId":"wovzkhex07e59vbi","timestamp":"20220127093437","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{ "topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wovr2kqb7qwhztwu","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_showPostId=wovzkhex07e59vbi#flow-post-wovzkhex07e59vbi","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_postId=wovzkhex07e59vbi\u0026topic_revId=wovzkhex07e59vbi\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=reply\u0026topic_postId=wovzkhex07e59vbi#flow-post-wovzkhex07e59vbi","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"976"},"author":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,459,0,0]}\"\u003E+1 to MUST/SHOULD/OPTIONAL vocabulary not really being useful for general guidelines. You MUST use Phabricator and Gerrit and MUST put your classes in an \u003Ccode data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[154,170,6,7]}\"\u003Esrc\u003C/code\u003E directory... or else what? Plenty of MediaWiki extension do not follow these rules; plenty of Wikimedia extensions do not follow many of the MUST rules, even. And I struggle to see what moral or legal authority anyone would have to make such declarations for plugins for a FLOSS software.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[461,976,0,0]}\"\u003EThere are a few security-related points that we'd probably enforce by dissociating problematic extensions from the project or warning users against them, but everything else is a recommendation. Maybe rename it as good / great / best or something like that? (The \u003Ca href=\"/wiki/API:Client_code/Gold_standard\" title=\"API:Client code/Gold standard\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;piped\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./API:Client_code/Gold_standard\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;API:Client code/Gold standard\u0026quot;},\u0026quot;dsr\u0026quot;:[724,776,32,2]}\"\u003EAPI best practices\u003C/a\u003E guideline uses gold/platinum, it doesn't have a third level though.) Or preserve MUST for the few things where, if we had an extension store, we would kick an extension out of it if it violated that.\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wovr2kqb7qwhztwu","postId":"wovzkhex07e59vbi","isMaxThreadingDepth":false,"creator":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"isNewPage":false,"replies":["wox8bnjv7h1yo5s7"]},"wows9yczwhrszn2b":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wovr2kqb7qwhztwu","articleTitle":"Topic:Wovr2kqb7qwhztwu","revisionId":"wows9yczwhrszn2b","timestamp":"20220127181006","changeType":"edit-post","dateFormats":[],"properties":[],"isOriginalContent":false, "isModerated":false,"links":{"post-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=history\u0026topic_postId=wows6m2id6uya1tb","title":"History","text":"History"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wovr2kqb7qwhztwu","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_showPostId=wows6m2id6uya1tb#flow-post-wows6m2id6uya1tb","title":"post","text":"post"},"diff":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=compare-post-revisions\u0026topic_newRevision=wows9yczwhrszn2b","title":"diff","text":"diff"},"diff-prev":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=compare-post-revisions\u0026topic_newRevision=wows9yczwhrszn2b","title":"prev","text":"prev"}, "post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_postId=wows6m2id6uya1tb\u0026topic_revId=wows9yczwhrszn2b\u0026action=single-view","title":"post revision","text":"post revision"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=reply\u0026topic_postId=wovr2kqb7qwhztwu#flow-post-wovr2kqb7qwhztwu","title":"Reply","text":"Reply"}},"size":{"old":"143","new":"144"},"author":{"name":"Izno","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Izno","title":"Contributions/Izno","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Izno","title":"Izno","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Izno","title":"User talk:Izno","exists":true,"_BC_bools":["exists"]}},"id":25850},"lastEditUser":{"name":"Izno","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Izno","title": "Contributions/Izno","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Izno","title":"Izno","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Izno","title":"User talk:Izno","exists":true,"_BC_bools":["exists"]}},"id":25850},"lastEditId":"wows9yczwhrszn2b","previousRevisionId":"wows6m2id6uya1tb","isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,144,0,0]}\"\u003EI specifically didn't speak to the RFC language since \u003Ca href=\"/wiki/Topic:Ugpw2635x8nzzp3z\" title=\"Topic:Ugpw2635x8nzzp3z\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Topic:Ugpw2635x8nzzp3z\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;Topic:Ugpw2635x8nzzp3z\u0026quot;},\u0026quot;dsr\u0026quot;:[54,80,2,2]}\"\u003ETopic:Ugpw2635x8nzzp3z\u003C/a\u003E (second discussion from the bottom) is pertinent on that point.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wovr2kqb7qwhztwu","postId":"wows6m2id6uya1tb","isMaxThreadingDepth":false,"creator":{"name":"Izno","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Izno", "title":"Contributions/Izno","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Izno","title":"Izno","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Izno","title":"User talk:Izno","exists":true,"_BC_bools":["exists"]}},"id":25850},"isNewPage":false,"replies":[]},"wox8bnjv7h1yo5s7":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wovr2kqb7qwhztwu","articleTitle":"Topic:Wovr2kqb7qwhztwu","revisionId":"wox8bnjv7h1yo5s7","timestamp":"20220127225815","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wovr2kqb7qwhztwu","title":"topic","text":"topic"},"post":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_showPostId=wox8bnjv7h1yo5s7#flow-post-wox8bnjv7h1yo5s7","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_postId=wox8bnjv7h1yo5s7\u0026topic_revId=wox8bnjv7h1yo5s7\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=reply\u0026topic_postId=wovzkhex07e59vbi#flow-post-wovzkhex07e59vbi","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=edit-topic-summary","title":"Summarize", "text":"Summarize"}},"size":{"old":"0","new":"738"},"author":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cblockquote data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[0,223,12,13]}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[12,210,0,0]}\"\u003E+1 to MUST/SHOULD/OPTIONAL vocabulary not really being useful for general guidelines. You MUST use Phabricator and Gerrit and MUST put your classes in an \u003Ccode data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[166,182,6,7]}\"\u003Esrc\u003C/code\u003E directory... or else what? \u003C/p\u003E\u003C/blockquote\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[223,385,0,0]}\"\u003E… or else you are not compliant with this document, and we would not call your extension \"best practice\", as judged by the standards of the MediaWiki ecosystem.\u003C/p\u003E\u003Cblockquote data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[385,671,12,13]}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[397,658,0,0]}\"\u003EPlenty of MediaWiki extension do not follow these rules; plenty of Wikimedia extensions do not follow many of the MUST rules, even. And I struggle to see what moral or legal authority anyone would have to make such declarations for plugins for a FLOSS software.\u003C/p\u003E\u003C/blockquote\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[671,740,0,0]}\"\u003EIndeed. Why do you think this page is claiming it has such authority?\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wovzkhex07e59vbi","postId":"wox8bnjv7h1yo5s7","isMaxThreadingDepth":false,"creator":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"isNewPage":false,"replies":[]},"wpdnhzjvkqs13tew":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wovr2kqb7qwhztwu","articleTitle":"Topic:Wovr2kqb7qwhztwu","revisionId":"wpdnhzjvkqs13tew","timestamp":"20220204075338","changeType":"reply","dateFormats":[],"properties":[], "isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wovr2kqb7qwhztwu","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_showPostId=wpdnhzjvkqs13tew#flow-post-wpdnhzjvkqs13tew","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_postId=wpdnhzjvkqs13tew\u0026topic_revId=wpdnhzjvkqs13tew\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=reply\u0026topic_postId=wpdnhzjvkqs13tew#flow-post-wpdnhzjvkqs13tew","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"326"},"author":{"name":"Legoktm","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Legoktm","title":"Contributions/Legoktm","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Legoktm","title":"Legoktm","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Legoktm","title":"User talk:Legoktm","exists":true,"_BC_bools":["exists"]}},"id":31711},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,326,0,0]}\"\u003EThis document isn't targeted towards private companies who want to make their own extensions. I think it is reasonable to have a baseline for *best practices* to use localization (one of MediaWiki's \u003Ca href=\"/wiki/Principles\" title=\"Principles\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Principles\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;Principles\u0026quot;},\u0026quot;dsr\u0026quot;:[200,214,2,2]}\"\u003EPrinciples\u003C/a\u003E), PSR-4 (a PHP best practice), and use Gerrit/Phabricator to be along with the rest of the MediaWiki ecosystem.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wovwygetm6d1xeqt","postId":"wpdnhzjvkqs13tew","isMaxThreadingDepth": false,"creator":{"name":"Legoktm","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Legoktm","title":"Contributions/Legoktm","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Legoktm","title":"Legoktm","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Legoktm","title":"User talk:Legoktm","exists":true,"_BC_bools":["exists"]}},"id":31711},"isNewPage":false,"replies":[]},"wpek4xn1zz31dbj7":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wovr2kqb7qwhztwu","articleTitle":"Topic:Wovr2kqb7qwhztwu","revisionId":"wpek4xn1zz31dbj7","timestamp":"20220204173941","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=history","title":"History","text":"History"}, "topic":{"url":"//www.mediawiki.org/wiki/Topic:Wovr2kqb7qwhztwu","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_showPostId=wpek4xn1zz31dbj7#flow-post-wpek4xn1zz31dbj7","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026topic_postId=wpek4xn1zz31dbj7\u0026topic_revId=wpek4xn1zz31dbj7\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=reply\u0026topic_postId=wovwygetm6d1xeqt#flow-post-wovwygetm6d1xeqt","title":"Reply","text":"Reply"},"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"964"},"author":{"name":"Izno","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Izno","title":"Contributions/Izno","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Izno","title":"Izno","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Izno","title":"User talk:Izno","exists":true,"_BC_bools":["exists"]}},"id":25850},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,369,0,0]}\"\u003EI don't think it's targeted at them, but it can trivially be read as if it were. Separately, because it leans on the RFC text as it does (I am increasingly not a fan in the way it changes the meaning of those words from the RFC), someone who does look at any given line with or without context will surely not see the forest from the trees when \"MUST\" is the word used.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[371,816,0,0]}\"\u003EThis document should cater to professional engineers because the advice it gives is valuable for anyone developing an extension, not just the open source or trivially-reached MediaWiki ecosystems. That's besides the already-provided organizations which \u003Cem about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[624,634,null,null],\u0026quot;pi\u0026quot;:[[{\u0026quot;k\u0026quot;:\u0026quot;1\u0026quot;}]]}\" data-mw=\"{\u0026quot;parts\u0026quot;:[{\u0026quot;template\u0026quot;:{\u0026quot;target\u0026quot;:{\u0026quot;wt\u0026quot;:\u0026quot;Em\u0026quot;,\u0026quot;href\u0026quot;:\u0026quot;./Template:Em\u0026quot;},\u0026quot;params\u0026quot;:{\u0026quot;1\u0026quot;:{\u0026quot;wt\u0026quot;:\u0026quot;are\u0026quot;}},\u0026quot;i\u0026quot;:0}}]}\"\u003Eare\u003C/em\u003E trivially-reached MediaWiki ecosystems and which themselves have an interest in observing these practices, yet clearly will not and do not have an interest in e.g. using WMF Gerrit.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[818,964,0,0]}\"\u003EGOLD/SILVER/BRONZE, or BEST/BETTER/CONSIDER/RECOMMENDED, or similar other words would be better on that point. Remember, these are best practices.\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wovwygetm6d1xeqt","postId":"wpek4xn1zz31dbj7","isMaxThreadingDepth":false,"creator":{"name":"Izno","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Izno","title":"Contributions/Izno","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Izno","title":"Izno","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Izno","title":"User talk:Izno","exists":true,"_BC_bools":["exists"]}},"id":25850},"isNewPage":false,"replies":[]},"wpa3epq1gwv527ew":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wp7lbx9iay3b93my","articleTitle":"Topic:Wp7lbx9iay3b93my","revisionId":"wpa3epq1gwv527ew","timestamp":"20220202173335","changeType":"lock-topic","dateFormats":[],"properties":{"topic-of-post":{},"topic-of-post-text-from-html":{}},"isOriginalContent":true,"isModerated": true,"links":{"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wp7lbx9iay3b93my","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=history","title":"History","text":"History"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=unwatch","title":"Unwatch","text":"Unwatch"},"topic-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026topic_revId=wpa3epq1gwv527ew\u0026action=single-view","title":"topic revision","text":"topic revision"}},"actions":[],"size":{"old":"66","new":"66"},"author":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists" ]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":"wp7lbx9ib02cd5m2","moderator":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"moderateState":"lock","moderateReason":{"content":"marked as resolved","format":"plaintext"},"isLocked":true, "isModeratedNotLocked":false,"content":{"content":"\u0026quot;Regularly submit and receive translations from translatewiki.net\u0026quot;","format":"topic-title-html","plaintext":"\"Regularly submit and receive translations from translatewiki.net\""},"watchable":false,"replyToId":null,"postId":"wp7lbx9iay3b93my","isMaxThreadingDepth":false,"creator":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title":"User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"isNewPage":false,"replies":["wp7lbx9ib21dh7l6","wp7vdv8gk2lvr17k","wpa1atwjzbg08hk2"],"reply_count":3,"last_updated_readable":"17:33, 2 February 2022","last_updated":1643823215000},"wp7lbx9ib21dh7l6":{ "_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wp7lbx9iay3b93my","articleTitle":"Topic:Wp7lbx9iay3b93my","revisionId":"wp7lbx9ib21dh7l6","timestamp":"20220201143607","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wp7lbx9iay3b93my","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026topic_showPostId=wp7lbx9ib21dh7l6#flow-post-wp7lbx9ib21dh7l6","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026topic_postId=wp7lbx9ib21dh7l6\u0026topic_revId=wp7lbx9ib21dh7l6\u0026action=single-view","title":"post revision", "text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"186"},"author":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title":"User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"lastEditUser":{"name":null,"wiki":null,"gender": "unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,186,0,0]}\"\u003EIt's a good idea for extensions to regularly receive translations from translatewiki.net (not that we really have a choice in the matter), but what does it mean to regularly submit them?\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wp7lbx9iay3b93my","postId":"wp7lbx9ib21dh7l6","isMaxThreadingDepth":false,"creator":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title": "User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"isNewPage":true,"replies":[]},"wp7vdv8gk2lvr17k":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wp7lbx9iay3b93my","articleTitle":"Topic:Wp7lbx9iay3b93my","revisionId":"wp7vdv8gk2lvr17k","timestamp":"20220201173639","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wp7lbx9iay3b93my","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026topic_showPostId=wp7vdv8gk2lvr17k#flow-post-wp7vdv8gk2lvr17k","title":"post","text":"post"},"post-revision":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026topic_postId=wp7vdv8gk2lvr17k\u0026topic_revId=wp7vdv8gk2lvr17k\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"631"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url": "/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,128,0,0]}\"\u003EI've \u003Ca rel=\"mw:ExtLink\" href=\"https://www.mediawiki.org/w/index.php?title=Best_practices_for_extensions\u0026amp;type=revision\u0026amp;diff=5050938\u0026amp;oldid=5050695\" class=\"external text\" data-parsoid=\"{\u0026quot;dsr\u0026quot;:[5,127,116,1]}\"\u003Eadded\u003C/a\u003E:\u003C/p\u003E\n\n\u003Cblockquote data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[130,510,12,13]}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[142,497,0,0]}\"\u003EFor extensions hosted in Wikimedia Gerrit, translatewiki.net staff will generally proactively do this for you. They start an automatic process which subscribes to new messages from your extension, and also automatically exports and merges updated translations back into your repository once a day. If this hasn't happened within a week, contact TWN staff.\u003C/p\u003E\u003C/blockquote\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[510,631,0,0]}\"\u003EI copied and summarised this from the \u003Ca href=\"/wiki/Translatewiki.net\" title=\"Translatewiki.net\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Translatewiki.net\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;translatewiki.net\u0026quot;},\u0026quot;dsr\u0026quot;:[548,569,2,2]}\"\u003Etranslatewiki.net\u003C/a\u003E page, which was previously linked from the same bullet point.\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wp7lbx9iay3b93my","postId":"wp7vdv8gk2lvr17k","isMaxThreadingDepth":false,"creator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"isNewPage":false,"replies":[]},"wpa1atwjzbg08hk2":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wp7lbx9iay3b93my","articleTitle":"Topic:Wp7lbx9iay3b93my","revisionId":"wpa1atwjzbg08hk2","timestamp":"20220202165544","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{ "url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wp7lbx9iay3b93my","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026topic_showPostId=wpa1atwjzbg08hk2#flow-post-wpa1atwjzbg08hk2","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026topic_postId=wpa1atwjzbg08hk2\u0026topic_revId=wpa1atwjzbg08hk2\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"30"},"author":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title":"User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,30,0,0]}\"\u003EThanks, that looks good to me.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wp7lbx9iay3b93my","postId":"wpa1atwjzbg08hk2","isMaxThreadingDepth":false,"creator":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title":"User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"isNewPage":false,"replies":[]},"wovd2orz2q3be7or":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m", "articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"wovd2orz2q3be7or","timestamp":"20220127025042","changeType":"lock-topic","dateFormats":[],"properties":{"topic-of-post":{},"topic-of-post-text-from-html":{}},"isOriginalContent":true,"isModerated":true,"links":{"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"},"topic-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_revId=wovd2orz2q3be7or\u0026action=single-view","title":"topic revision","text":"topic revision"}},"actions":[],"size":{ "old":"41","new":"41"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":"uwqk40oa4idj7j8q","moderator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id": 135822},"moderateState":"lock","moderateReason":{"content":"marked as resolved","format":"plaintext"},"isLocked":true,"isModeratedNotLocked":false,"content":{"content":"Don\u0026#039;t: directly construct service objects","format":"topic-title-html","plaintext":"Don't: directly construct service objects"},"summary":{"revision":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"wovd2sdvwhqqgmnc","timestamp":"20220127025045","changeType":"create-topic-summary","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"watch-topic":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"},"summary-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topicsummary_revId=wovd2sdvwhqqgmnc\u0026action=view-topic-summary","title":"summary revision","text":"summary revision"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"32"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url": "/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,32,0,0]}\"\u003ESee \u003Ca href=\"/wiki/Stable_interface_policy\" title=\"Stable interface policy\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Stable_interface_policy\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;Stable interface policy\u0026quot;},\u0026quot;dsr\u0026quot;:[4,31,2,2]}\"\u003EStable interface policy\u003C/a\u003E.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"creator":{"name":"Krinkle","wiki": "mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822}}},"watchable":false,"replyToId":null,"postId":"uwqk40oa4gei3h9m","isMaxThreadingDepth":false,"creator":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"isNewPage":false,"replies":["uwqk40oa4kckbl7u", "uwqty1k00dlhihhx","uxojldfki2bzs7je","uxpkm4vvzcmjtt7u","uxq4yfynm8k6wns5","uxyqjbaso24al6xh","uxytkm182whbtvim","uxz7intr6fnf16pe","uxz8632iplamrjr1","uxze4frlnpn1ptud","uxzepcsigdj4q5xe","uxzi9d5nt34x61xx","uy2zhsexslw0zgwl","wovd2hk5tlmutrmp"],"reply_count":14,"last_updated_readable":"02:50, 27 January 2022","last_updated":1643251842000},"uwqk40oa4kckbl7u":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uwqk40oa4kckbl7u","timestamp":"20190327161024","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uwqk40oa4kckbl7u#flow-post-uwqk40oa4kckbl7u","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uwqk40oa4kckbl7u\u0026topic_revId=uwqk40oa4kckbl7u\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"672"},"author":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url": "/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,469,0,0]}\"\u003EIn a way similar to protected methods, constructor signatures of service-like objects are generally not stable. They are intended for use by wiring code, and can be expected to change without notice. Extensions (and all application logic) should ideally only ever directly construct plain value objects. However, we still have quite a number of things in core that are neither service objects nor value objects. So I propose to add the following to the \"Don't\" section:\u003C/p\u003E\n\n\u003Cul data-parsoid=\"{\u0026quot;dsr\u0026quot;:[471,672,0,0]}\"\u003E\u003Cli data-parsoid=\"{\u0026quot;dsr\u0026quot;:[471,594,1,0]}\"\u003EMUST NOT: directly instantiate a service class defined by core, instead of obtaining an instance via a service container.\u003C/li\u003E\n\u003Cli data-parsoid=\"{\u0026quot;dsr\u0026quot;:[595,672,1,0]}\"\u003ESHOULD NOT: directly instantiate anything that is not a plain value object.\u003C/li\u003E\u003C/ul\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uwqk40oa4kckbl7u","isMaxThreadingDepth":false,"creator":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"isNewPage":true,"replies":[]},"uwqty1k00dlhihhx":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uwqty1k00dlhihhx","timestamp":"20190327190659","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent": true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uwqty1k00dlhihhx#flow-post-uwqty1k00dlhihhx","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uwqty1k00dlhihhx\u0026topic_revId=uwqty1k00dlhihhx\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"12"},"author":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,12,0,0]}\"\u003ESounds good.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uwqty1k00dlhihhx","isMaxThreadingDepth":false,"creator":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"isNewPage":false,"replies":[]},"uxojldfki2bzs7je":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"], "workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uxojldfki2bzs7je","timestamp":"20190411221943","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uxojldfki2bzs7je#flow-post-uxojldfki2bzs7je","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uxojldfki2bzs7je\u0026topic_revId=uxojldfki2bzs7je\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch", "text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"205"},"author":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,205,0,0]}\"\u003ESometimes you need a service with non-default configuration, most commonly when doing cross-wiki things. (Random recent example: \u003Ca rel=\"mw:ExtLink\" href=\"https://gerrit.wikimedia.org/r/c/mediawiki/extensions/JsonConfig/+/503004\" class=\"external autonumber\" data-parsoid=\"{\u0026quot;targetOff\u0026quot;:203,\u0026quot;contentOffsets\u0026quot;:[203,203],\u0026quot;dsr\u0026quot;:[129,204,74,1]}\"\u003E\u003C/a\u003E)\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uxojldfki2bzs7je","isMaxThreadingDepth":false,"creator":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)", "exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"isNewPage":false,"replies":[]},"uxpkm4vvzcmjtt7u":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uxpkm4vvzcmjtt7u","timestamp":"20190412092429","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uxpkm4vvzcmjtt7u#flow-post-uxpkm4vvzcmjtt7u","title":"post","text": "post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uxpkm4vvzcmjtt7u\u0026topic_revId=uxpkm4vvzcmjtt7u\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"344"},"author":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title": "DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,84,0,0]}\"\u003EAs long as that is in core, it could be acceptable. Extensions should never do that.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[86,199,0,0]}\"\u003EThe Right Way (tm) is to introduce a factory service that you can ask for a service instance for the target wiki.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[201,344,0,0]}\"\u003EEventually (tm) we'd want a full MediaWikiServices instance for the target wiki. That will be possible as soon as no service uses global state.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uxpkm4vvzcmjtt7u","isMaxThreadingDepth":false,"creator":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title": "Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"isNewPage":false,"replies":[]},"uxq4yfynm8k6wns5":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uxq4yfynm8k6wns5","timestamp":"20190412152945","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uxq4yfynm8k6wns5#flow-post-uxq4yfynm8k6wns5","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uxq4yfynm8k6wns5\u0026topic_revId=uxq4yfynm8k6wns5\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"515"},"author":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)", "title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,515,0,0]}\"\u003EWe won't realistically introduce factories for all the services which depend on the wiki (which is basically all the services), MediaWikiServices doesn't support using foreign wiki configuration yet (even if it will, that will only cover wikis in the same farm, which is not the only use case), and expecting extension authors to make core changes instead of doing simple workarounds in their extensions is not realistic or reasonable IMO (especially as long as we don't get our code review problems under control).\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uxq4yfynm8k6wns5","isMaxThreadingDepth":false,"creator":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true, "_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"isNewPage":false,"replies":[]},"uxyqjbaso24al6xh":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uxyqjbaso24al6xh","timestamp":"20190416120841","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uxyqjbaso24al6xh#flow-post-uxyqjbaso24al6xh","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uxyqjbaso24al6xh\u0026topic_revId=uxyqjbaso24al6xh\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"492"},"author":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url": "/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,72,0,0]}\"\u003E\u0026gt; MediaWikiServices doesn't support using foreign wiki configuration yet\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[74,156,0,0]}\"\u003EActually, it does. But not all services are completely isolated from global state.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[158,299,0,0]}\"\u003E\u0026gt; expecting extension authors to make core changes instead of doing simple workarounds in their extensions is not realistic or reasonable IMO\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[301,492,0,0]}\"\u003EThese workarounds are what is preventing core changes, because we break them when we change core. I would expect extension authors to request or propose core changes when they need them, yes.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId": "uwqk40oa4gei3h9m","postId":"uxyqjbaso24al6xh","isMaxThreadingDepth":false,"creator":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"isNewPage":false,"replies":[]},"uxytkm182whbtvim":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uxytkm182whbtvim","timestamp":"20190416130312","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{ "url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uxytkm182whbtvim#flow-post-uxytkm182whbtvim","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uxytkm182whbtvim\u0026topic_revId=uxytkm182whbtvim\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"980"},"author":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,234,0,0]}\"\u003EReconsidering what I just said: extensions may have a need to call constructors of services if they extend the service class, or if the replace the service instance. That is, they may need to call service constructors in wiring code. \u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[236,454,0,0]}\"\u003EThis is fine as long as the service is declared to be extensible - which implies that the constructor signature is treated as public and stable. Constructor signatures of other services should not be considered stable.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[456,980,0,0]}\"\u003EThe rationale for this restriction is to support better dependency injection: with DI, there is often a need to change constructor signatures. Which is generally no problem since DI says that the constructor is only called in the wiring code, so there is only one place that needs to be changed to accommodate the new signature. Making such changes backwards compatible is a burden that should be avoided when possible - that is, we should only pay that cost in cases where the service is intended as an extension interface.\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uxytkm182whbtvim","isMaxThreadingDepth":false,"creator":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"isNewPage":false,"replies":[]},"uxz7intr6fnf16pe":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uxz7intr6fnf16pe","timestamp":"20190416171337","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent": true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uxz7intr6fnf16pe#flow-post-uxz7intr6fnf16pe","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uxz7intr6fnf16pe\u0026topic_revId=uxz7intr6fnf16pe\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"1188"},"author":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,20,0,0]}\"\u003E\u0026gt; Actually, it does.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[22,339,0,0]}\"\u003EActually, it doesn't\u003Cspan typeof=\"mw:DisplaySpace mw:Placeholder\" data-parsoid=\"{\u0026quot;src\u0026quot;:\u0026quot; \u0026quot;,\u0026quot;isDisplayHack\u0026quot;:true,\u0026quot;dsr\u0026quot;:[42,43,null,0]}\"\u003E \u003C/span\u003E:) There is no way for me to obtain a DI container for a foreign wiki, short of constructing that container myself using a fake configuration object that I also construct myself, which is a lot more nasty than constructing a specific service manually using a specific wiki ID and language object.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[341,436,0,0]}\"\u003E\u0026gt; I would expect extension authors to request or propose core changes when they need them, yes.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[438,945,0,0]}\"\u003EThat's a reasonable expectations for WMF staff maintaining extensions used in Wikimedia production. It's a completely unreasonable expectation for people running their own wikis, possibly in their free time, their bug reports get mostly ignored and their patches spend months if not forever in Gerrit without anyone ever looking at them. The MediaWiki community just does not provide the level of volunteer support currently where we could in good conscience ask people to have their problems fixed in core.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[947,1188,0,0]}\"\u003EMore specifically to the foreign wiki issue, what would the core change be? Do we really want to create a factory class for everything that takes a wiki ID, when those classes won't be necessary once MediaWikiServices supports foreign wikis?\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uxz7intr6fnf16pe","isMaxThreadingDepth":false,"creator":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"isNewPage":false,"replies":[]},"uxzaoqkrjonqrd85":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uxzaoqkrjonqrd85","timestamp":"20190416181031","changeType":"edit-post","dateFormats":[],"properties":[],"isOriginalContent":false,"isModerated":false,"links":{ "post-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history\u0026topic_postId=uxz8632iplamrjr1","title":"History","text":"History"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uxz8632iplamrjr1#flow-post-uxz8632iplamrjr1","title":"post","text":"post"},"diff":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=compare-post-revisions\u0026topic_newRevision=uxzaoqkrjonqrd85","title":"diff","text":"diff"},"diff-prev":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=compare-post-revisions\u0026topic_newRevision=uxzaoqkrjonqrd85","title":"prev","text":"prev"},"post-revision":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uxz8632iplamrjr1\u0026topic_revId=uxzaoqkrjonqrd85\u0026action=single-view","title":"post revision","text":"post revision"}},"actions":[],"size":{"old":"1132","new":"1131"},"author":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"lastEditUser":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)", "title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"lastEditId":"uxzaoqkrjonqrd85","previousRevisionId":"uxz8632iplamrjr1","isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,148,0,0]}\"\u003E\u0026gt; There is no way for me to obtain a DI container for a foreign wiki, short of constructing that container myself using a fake configuration object\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[150,365,0,0]}\"\u003ERight - the problem is that there is no clean way to get the config settings for another wiki. For this to be complete, it would have to include the enabled extensions as well, so we'll need injecteble hook runners.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[367,606,0,0]}\"\u003E\u0026gt; It's a completely unreasonable expectation for people running their own wikis, possibly in their free time, their bug reports get mostly ignored and their patches spend months if not forever in Gerrit without anyone ever looking at them.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[608,744,0,0]}\"\u003EThis policy doesn't apply to people writing their own extension for their own use. But yes, their extension might break without warning.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[746,989,0,0]}\"\u003E\u0026gt; More specifically to the foreign wiki issue, what would the core change be? Do we really want to create a factory class for everything that takes a wiki ID, when those classes won't be necessary once MediaWikiServices supports foreign wikis?\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[991,1131,0,0]}\"\u003EI'm not particularly keen on doing that, but the code is trivial enough. We could have a helper class or a trait for the boiler plate, even.\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uxz8632iplamrjr1","isMaxThreadingDepth":false,"creator":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"isNewPage":false,"replies":[]},"uxze4frlnpn1ptud":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uxze4frlnpn1ptud","timestamp":"20190416191213","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent": true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uxze4frlnpn1ptud#flow-post-uxze4frlnpn1ptud","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uxze4frlnpn1ptud\u0026topic_revId=uxze4frlnpn1ptud\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"293"},"author":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,293,0,0]}\"\u003EThis page is definitely meant for people writing their own extensions, so that they end up with maintainable code that others can reuse. Although I guess it would make sense to treat it as a policy (which it currently isn't) for Wikimedia-deployed extensions and merely as guidance for others.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uxze4frlnpn1ptud","isMaxThreadingDepth":false,"creator":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":[ "exists"]}},"id":1127507},"isNewPage":false,"replies":[]},"uxzepcsigdj4q5xe":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uxzepcsigdj4q5xe","timestamp":"20190416192239","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uxzepcsigdj4q5xe#flow-post-uxzepcsigdj4q5xe","title":"post","text":"post"},"post-revision":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uxzepcsigdj4q5xe\u0026topic_revId=uxzepcsigdj4q5xe\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"112"},"author":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":[ "exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,112,0,0]}\"\u003EYou are right, of course - it is \u003Ci data-parsoid=\"{\u0026quot;dsr\u0026quot;:[33,42,2,2]}\"\u003Emeant\u003C/i\u003E for them, but thy are not \u003Ci data-parsoid=\"{\u0026quot;dsr\u0026quot;:[69,78,2,2]}\"\u003Ebound\u003C/i\u003E by it. Sorry for being imprecise.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uxzepcsigdj4q5xe","isMaxThreadingDepth":false,"creator":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{ "contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"isNewPage":false,"replies":[]},"uxzi9d5nt34x61xx":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uxzi9d5nt34x61xx","timestamp":"20190416202630","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url": "//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uxzi9d5nt34x61xx#flow-post-uxzi9d5nt34x61xx","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uxzi9d5nt34x61xx\u0026topic_revId=uxzi9d5nt34x61xx\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"140"},"author":{"name":"Tgr (WMF)","wiki": "mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,140,0,0]}\"\u003EThe point is, don't add MUST NOTs that are not reasonable expectations for most of the intended audience (even if they are not bound by it).\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uxzi9d5nt34x61xx", "isMaxThreadingDepth":false,"creator":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"isNewPage":false,"replies":[]},"uy2zhsexslw0zgwl":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"uy2zhsexslw0zgwl","timestamp":"20190418095515","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history", "title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=uy2zhsexslw0zgwl#flow-post-uy2zhsexslw0zgwl","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=uy2zhsexslw0zgwl\u0026topic_revId=uy2zhsexslw0zgwl\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new": "908"},"author":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,234,0,0]}\"\u003EI think they are reasonable expectations. The only way to get out of the we-can't-change-core-without-breaking-extensions dead end is to limit what extensions can do (or what they can expect to continue working with the next release).\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[236,342,0,0]}\"\u003EBut you are right about my original proposal being too restrictive. It should be more along the lines of: \u003C/p\u003E\n\n\u003Cul data-parsoid=\"{\u0026quot;dsr\u0026quot;:[344,565,0,0]}\"\u003E\u003Cli data-parsoid=\"{\u0026quot;dsr\u0026quot;:[344,565,1,0]}\"\u003EMUST NOT: directly instantiate a service class defined by core, instead of obtaining an instance via a service container, except when wrapping, replacing or defining a service that is documented to be an extension point.\u003C/li\u003E\u003C/ul\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[567,604,0,0]}\"\u003EAnother way of phrasing this would be\u003C/p\u003E\n\n\u003Cul data-parsoid=\"{\u0026quot;dsr\u0026quot;:[606,825,0,0]}\"\u003E\u003Cli data-parsoid=\"{\u0026quot;dsr\u0026quot;:[606,825,1,0]}\"\u003EMUST NOT rely on the stability of a constructor signature of a class that is not defined to be a pure value object, or documented to be an extension point suitable for subclassing or direct construction by extensions.\u003C/li\u003E\u003C/ul\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[827,900,0,0]}\"\u003EThe second option is not less restrictive, but perhaps more to the point.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[902,908,0,0]}\"\u003E\u003Cbr data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;selfClose\u0026quot;:true,\u0026quot;dsr\u0026quot;:[902,908,6,0]}\"/\u003E\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"uy2zhsexslw0zgwl","isMaxThreadingDepth":false,"creator":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"isNewPage":false,"replies":[]},"wovd2hk5tlmutrmp":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqk40oa4gei3h9m","articleTitle":"Topic:Uwqk40oa4gei3h9m","revisionId":"wovd2hk5tlmutrmp","timestamp":"20220127025036","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent": true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_showPostId=wovd2hk5tlmutrmp#flow-post-wovd2hk5tlmutrmp","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026topic_postId=wovd2hk5tlmutrmp\u0026topic_revId=wovd2hk5tlmutrmp\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"61"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,61,0,0]}\"\u003EI believe this is now covered by \u003Ca href=\"/wiki/Stable_interface_policy\" title=\"Stable interface policy\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Stable_interface_policy\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;Stable interface policy\u0026quot;},\u0026quot;dsr\u0026quot;:[33,60,2,2]}\"\u003EStable interface policy\u003C/a\u003E.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uwqk40oa4gei3h9m","postId":"wovd2hk5tlmutrmp","isMaxThreadingDepth":false,"creator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]}, "userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"isNewPage":false,"replies":[]},"wovd0g6ktegst8up":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uxojqdvbtjpbbb94","articleTitle":"Topic:Uxojqdvbtjpbbb94","revisionId":"wovd0g6ktegst8up","timestamp":"20220127024935","changeType":"lock-topic","dateFormats":[],"properties":{"topic-of-post":{},"topic-of-post-text-from-html":{}},"isOriginalContent":true,"isModerated":true,"links":{"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uxojqdvbtjpbbb94","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=history","title":"History","text":"History"},"watch-topic":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=unwatch","title":"Unwatch","text":"Unwatch"},"topic-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026topic_revId=wovd0g6ktegst8up\u0026action=single-view","title":"topic revision","text":"topic revision"}},"actions":[],"size":{"old":"19","new":"19"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null}, "lastEditId":null,"previousRevisionId":"uxojqdvbtlocfd88","moderator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"moderateState":"lock","moderateReason":{"content":"marked as resolved","format":"plaintext"},"isLocked":true,"isModeratedNotLocked":false,"content":{"content":"Deprecate /includes","format":"topic-title-html","plaintext":"Deprecate /includes"},"summary":{"revision":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked"],"workflowId":"uxojqdvbtjpbbb94","articleTitle":"Topic:Uxojqdvbtjpbbb94","revisionId":"wovd10mr3tarr46g","timestamp":"20220127024952","changeType":"create-topic-summary", "dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uxojqdvbtjpbbb94","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=history","title":"History","text":"History"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=unwatch","title":"Unwatch","text":"Unwatch"},"summary-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026topicsummary_revId=wovd10mr3tarr46g\u0026action=view-topic-summary","title":"summary revision","text":"summary revision"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0" ,"new":"51"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,51,0,0]}\"\u003EDone, we now recommend PSR4 and a \"/src\" directory.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"creator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url": "/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822}}},"watchable":false,"replyToId":null,"postId":"uxojqdvbtjpbbb94","isMaxThreadingDepth":false,"creator":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"isNewPage":false,"replies":["uxojqdvbtnndjf7c","uxopqqqq2ak2cjra"],"reply_count":2,"last_updated_readable":"02:49, 27 January 2022","last_updated": 1643251775000},"uxojqdvbtnndjf7c":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uxojqdvbtjpbbb94","articleTitle":"Topic:Uxojqdvbtjpbbb94","revisionId":"uxojqdvbtnndjf7c","timestamp":"20190411222213","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uxojqdvbtjpbbb94","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026topic_showPostId=uxojqdvbtnndjf7c#flow-post-uxojqdvbtnndjf7c","title":"post","text":"post"},"post-revision":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026topic_postId=uxojqdvbtnndjf7c\u0026topic_revId=uxojqdvbtnndjf7c\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"176"},"author":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url": "/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,176,0,0]}\"\u003ESee comment at \u003Ca href=\"/wiki/Manual_talk:Coding_conventions/PHP#Directory_Structure\" class=\"mw-redirect\" title=\"Manual talk:Coding conventions/PHP\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Manual_talk:Coding_conventions/PHP#Directory_Structure\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;Manual talk:Coding conventions/PHP#Directory Structure\u0026quot;},\u0026quot;dsr\u0026quot;:[15,73,2,2]}\"\u003EManual talk:Coding conventions/PHP#Directory Structure\u003C/a\u003E. I agree; we should follow standard PHP naming conventions and use /src for at least PSR-4 extensions.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uxojqdvbtjpbbb94","postId": "uxojqdvbtnndjf7c","isMaxThreadingDepth":false,"creator":{"name":"Tgr (WMF)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Tgr_(WMF)","title":"Contributions/Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Tgr_(WMF)","title":"Tgr (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Tgr_(WMF)","title":"User talk:Tgr (WMF)","exists":true,"_BC_bools":["exists"]}},"id":1127507},"isNewPage":true,"replies":[]},"uxopqqqq2ak2cjra":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uxojqdvbtjpbbb94","articleTitle":"Topic:Uxojqdvbtjpbbb94","revisionId":"uxopqqqq2ak2cjra","timestamp":"20190412001008","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uxojqdvbtjpbbb94","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026topic_showPostId=uxopqqqq2ak2cjra#flow-post-uxopqqqq2ak2cjra","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026topic_postId=uxopqqqq2ak2cjra\u0026topic_revId=uxopqqqq2ak2cjra\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"67"},"author":{"name":"BDavis (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/BDavis_(WMF)","title":"Contributions/BDavis (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:BDavis_(WMF)","title":"BDavis (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:BDavis_(WMF)","title":"User talk:BDavis (WMF)","exists":true,"_BC_bools":["exists"]}},"id":957628},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,67,0,0]}\"\u003E+1 for src/ in new projects. includes/ is a very PHP3/4 convention.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uxojqdvbtjpbbb94","postId":"uxopqqqq2ak2cjra","isMaxThreadingDepth":false,"creator":{"name":"BDavis (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/BDavis_(WMF)","title":"Contributions/BDavis (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:BDavis_(WMF)","title":"BDavis (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:BDavis_(WMF)","title":"User talk:BDavis (WMF)","exists":true,"_BC_bools":["exists"]}},"id":957628},"isNewPage":false,"replies":[]},"wovcztbrv6bqc8xu":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth", "isNewPage"],"workflowId":"uwqjvrjzh84larvx","articleTitle":"Topic:Uwqjvrjzh84larvx","revisionId":"wovcztbrv6bqc8xu","timestamp":"20220127024916","changeType":"lock-topic","dateFormats":[],"properties":{"topic-of-post":{},"topic-of-post-text-from-html":{}},"isOriginalContent":true,"isModerated":true,"links":{"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqjvrjzh84larvx","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=history","title":"History","text":"History"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=unwatch","title":"Unwatch","text":"Unwatch"},"topic-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026topic_revId=wovcztbrv6bqc8xu\u0026action=single-view","title":"topic revision", "text":"topic revision"}},"actions":[],"size":{"old":"68","new":"68"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":"uwqjvrjzha3metv1","moderator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle", "exists":true,"_BC_bools":["exists"]}},"id":135822},"moderateState":"lock","moderateReason":{"content":"marked as resolved","format":"plaintext"},"isLocked":true,"isModeratedNotLocked":false,"content":{"content":"Don\u0026#039;t: subclass anything not intended to be subclassed by extensions","format":"topic-title-html","plaintext":"Don't: subclass anything not intended to be subclassed by extensions"},"summary":{"revision":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked"],"workflowId":"uwqjvrjzh84larvx","articleTitle":"Topic:Uwqjvrjzh84larvx","revisionId":"wovczzcamz586e6f","timestamp":"20220127024921","changeType":"create-topic-summary","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqjvrjzh84larvx","title":"topic","text":"topic"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=history","title":"History","text": "History"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=unwatch","title":"Unwatch","text":"Unwatch"},"summary-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026topicsummary_revId=wovczzcamz586e6f\u0026action=view-topic-summary","title":"summary revision","text":"summary revision"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"38"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]}, "talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,38,0,0]}\"\u003EDone, per \u003Ca href=\"/wiki/Stable_interface_policy\" title=\"Stable interface policy\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Stable_interface_policy\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;Stable interface policy\u0026quot;},\u0026quot;dsr\u0026quot;:[10,37,2,2]}\"\u003EStable interface policy\u003C/a\u003E.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"creator":{"name":"Krinkle", "wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822}}},"watchable":false,"replyToId":null,"postId":"uwqjvrjzh84larvx","isMaxThreadingDepth":false,"creator":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"isNewPage":false,"replies":[ "uwqjvrjzhc2nivu5","uwqlacrn7xqtpynh","wovczoik2vzlb3qb"],"reply_count":3,"last_updated_readable":"02:49, 27 January 2022","last_updated":1643251756000},"uwqjvrjzhc2nivu5":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqjvrjzh84larvx","articleTitle":"Topic:Uwqjvrjzh84larvx","revisionId":"uwqjvrjzhc2nivu5","timestamp":"20190327160617","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqjvrjzh84larvx","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026topic_showPostId=uwqjvrjzhc2nivu5#flow-post-uwqjvrjzhc2nivu5","title":"post","text":"post"},"post-revision":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026topic_postId=uwqjvrjzhc2nivu5\u0026topic_revId=uwqjvrjzhc2nivu5\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"1271"},"author":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools": ["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,54,0,0]}\"\u003EI propose to add the following to the \"Don't\" section:\u003C/p\u003E\n\n\u003Cul data-parsoid=\"{\u0026quot;dsr\u0026quot;:[56,201,0,0]}\"\u003E\u003Cli data-parsoid=\"{\u0026quot;dsr\u0026quot;:[56,201,1,0]}\"\u003EMUST NOT: subclass (extend) any class defined by MediaWiki core, unless that class is explicitly documented to allow subclassing by extensions.\u003C/li\u003E\u003C/ul\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[201,417,0,0]}\"\u003E\n\nThe reason for this is that protected methods are not part of our stable interface per the \u003Ca href=\"/wiki/Deprecation_policy\" class=\"mw-redirect\" title=\"Deprecation policy\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Deprecation_policy\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;Deprecation policy\u0026quot;},\u0026quot;dsr\u0026quot;:[294,316,2,2]}\"\u003EDeprecation policy\u003C/a\u003E, so such subclasses may break without warning. The relevant section of the deprecation policy reads:\u003C/p\u003E\u003Cblockquote data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[417,908,12,13]}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[429,895,0,0]}\"\u003E[...] the stable part of the PHP API is comprised of all code that is explicitly marked public, and has been included in at least one stable release. In addition, some classes expect to be subclassed in extensions; in those cases protected functions also are included in the API. These classes should have a note in their documentation comment that they expect subclassing. If no note is present, it SHOULD be assumed that the class is not expected to be subclassed.\u003C/p\u003E\u003C/blockquote\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[908,1120,0,0]}\"\u003EI'm tempted to even extend this to implementing interfaces. Not all interface declarations are intended as extension points, and not all of them should be considered stable. If we go that far, we should also add:\u003C/p\u003E\n\n\u003Cul data-parsoid=\"{\u0026quot;dsr\u0026quot;:[1122,1271,0,0]}\"\u003E\u003Cli data-parsoid=\"{\u0026quot;dsr\u0026quot;:[1122,1271,1,0]}\"\u003EMUST NOT: implement any interface declared by MediaWiki core, unless that interface is explicitly documented to allow implementation by extensions.\u003C/li\u003E\u003C/ul\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"uwqjvrjzh84larvx","postId":"uwqjvrjzhc2nivu5","isMaxThreadingDepth":false,"creator":{"name":"DKinzler (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/DKinzler_(WMF)","title":"Contributions/DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:DKinzler_(WMF)","title":"DKinzler (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:DKinzler_(WMF)","title":"User talk:DKinzler (WMF)","exists":true,"_BC_bools":["exists"]}},"id":14969248},"isNewPage":true,"replies":[]},"uwqlacrn7xqtpynh":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqjvrjzh84larvx","articleTitle":"Topic:Uwqjvrjzh84larvx","revisionId":"uwqlacrn7xqtpynh","timestamp":"20190327163131","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent": true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqjvrjzh84larvx","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026topic_showPostId=uwqlacrn7xqtpynh#flow-post-uwqlacrn7xqtpynh","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026topic_postId=uwqlacrn7xqtpynh\u0026topic_revId=uwqlacrn7xqtpynh\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"458"},"author":{"name":"Thiemo Kreuz (WMDE)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Thiemo_Kreuz_(WMDE)","title":"Contributions/Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Thiemo_Kreuz_(WMDE)","title":"Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Thiemo_Kreuz_(WMDE)","title":"User talk:Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":1318738},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,36,0,0]}\"\u003E+1 to both suggestions from my side.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[38,458,0,0]}\"\u003EI, personally, find it a really helpful rule-of-thumb to consider all classes to be \u003Ccode data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[122,140,6,7]}\"\u003Efinal\u003C/code\u003E, except otherwise stated. The effect of this restriction is pretty much the same as you suggest: one can not extend anything, except it is allowed. The only reason we are not literally marking all our code as \u003Ccode data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;html\u0026quot;,\u0026quot;dsr\u0026quot;:[350,368,6,7]}\"\u003Efinal\u003C/code\u003E is that it would be cumbersome and error-prone. But we should still threat it like it is.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html" },"watchable":false,"replyToId":"uwqjvrjzh84larvx","postId":"uwqlacrn7xqtpynh","isMaxThreadingDepth":false,"creator":{"name":"Thiemo Kreuz (WMDE)","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Thiemo_Kreuz_(WMDE)","title":"Contributions/Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Thiemo_Kreuz_(WMDE)","title":"Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Thiemo_Kreuz_(WMDE)","title":"User talk:Thiemo Kreuz (WMDE)","exists":true,"_BC_bools":["exists"]}},"id":1318738},"isNewPage":false,"replies":[]},"wovczoik2vzlb3qb":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"uwqjvrjzh84larvx","articleTitle":"Topic:Uwqjvrjzh84larvx","revisionId":"wovczoik2vzlb3qb","timestamp":"20220127024912","changeType":"reply","dateFormats":[],"properties":[], "isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Uwqjvrjzh84larvx","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026topic_showPostId=wovczoik2vzlb3qb#flow-post-wovczoik2vzlb3qb","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026topic_postId=wovczoik2vzlb3qb\u0026topic_revId=wovczoik2vzlb3qb\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"summarize":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"60"},"author":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,60,0,0]}\"\u003EThis has been superseded by the \u003Ca href=\"/wiki/Stable_interface_policy\" title=\"Stable interface policy\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./Stable_interface_policy\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;Stable interface policy\u0026quot;},\u0026quot;dsr\u0026quot;:[32,59,2,2]}\"\u003EStable interface policy\u003C/a\u003E.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"uwqjvrjzh84larvx","postId":"wovczoik2vzlb3qb","isMaxThreadingDepth":false,"creator":{"name":"Krinkle","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Krinkle","title":"Contributions/Krinkle","exists":true,"_BC_bools":["exists"]}, "userpage":{"url":"/wiki/User:Krinkle","title":"Krinkle","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Krinkle","title":"User talk:Krinkle","exists":true,"_BC_bools":["exists"]}},"id":135822},"isNewPage":false,"replies":[]},"wp7kzldzukfefuak":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wp7kzldzuigdbsbg","articleTitle":"Topic:Wp7kzldzuigdbsbg","revisionId":"wp7kzldzukfefuak","timestamp":"20220201142958","changeType":"new-post","dateFormats":[],"properties":{"topic-of-post":{},"topic-of-post-text-from-html":{}},"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wp7kzldzuigdbsbg","title":"topic","text":"topic"},"post":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_showPostId=wp7kzldzuigdbsbg#flow-post-wp7kzldzuigdbsbg","title":"post","text":"post"},"topic-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_revId=wp7kzldzukfefuak\u0026action=single-view","title":"topic revision","text":"topic revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=reply\u0026topic_postId=wp7kzldzuigdbsbg#flow-post-wp7kzldzuigdbsbg-form-content","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}}, "size":{"old":"0","new":"4"},"author":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title":"User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content":"OOUI","format":"topic-title-html","plaintext":"OOUI"},"watchable":false,"replyToId":null,"postId":"wp7kzldzuigdbsbg","isMaxThreadingDepth":false,"creator":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists" :true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title":"User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"isNewPage":false,"replies":["wp7kzldzumefjw9o","wp84f6t8k9eizygi","wp8ovftzfnrjyo0s","wpdnr8rcnnv50lid","wpecj1cjbkjy44qx"],"reply_count":5,"last_updated_readable":"15:23, 4 February 2022","last_updated":1643988184000},"wp7ltp7q9l2phdwq":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wp7kzldzuigdbsbg","articleTitle":"Topic:Wp7kzldzuigdbsbg","revisionId":"wp7ltp7q9l2phdwq","timestamp":"20220201144459","changeType":"edit-post","dateFormats":[],"properties":[],"isOriginalContent":false,"isModerated":false,"links":{"post-history":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=history\u0026topic_postId=wp7kzldzumefjw9o","title":"History","text":"History"},"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wp7kzldzuigdbsbg","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_showPostId=wp7kzldzumefjw9o#flow-post-wp7kzldzumefjw9o","title":"post","text":"post"},"diff":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=compare-post-revisions\u0026topic_newRevision=wp7ltp7q9l2phdwq","title":"diff","text":"diff"},"diff-prev":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=compare-post-revisions\u0026topic_newRevision=wp7ltp7q9l2phdwq","title":"prev","text":"prev"},"post-revision":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_postId=wp7kzldzumefjw9o\u0026topic_revId=wp7ltp7q9l2phdwq\u0026action=single-view","title":"post revision","text":"post revision"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=reply\u0026topic_postId=wp7kzldzumefjw9o#flow-post-wp7kzldzumefjw9o","title":"Reply","text":"Reply"}},"size":{"old":"298","new":"298"},"author":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title":"User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"lastEditUser":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url": "/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title":"User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"lastEditId":"wp7ltp7q9l2phdwq","previousRevisionId":"wp7kzldzumefjw9o","isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,155,0,0]}\"\u003EShould there be something here about using \u003Ca href=\"/wiki/OOUI\" title=\"OOUI\" rel=\"mw:WikiLink\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;simple\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;./OOUI\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;OOUI\u0026quot;},\u0026quot;dsr\u0026quot;:[43,51,2,2]}\"\u003EOOUI\u003C/a\u003E when possible to create interface elements, instead of using the Html class or (*gasp*) hardcoded HTML?\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[157,298,0,0]}\"\u003EBy the way, the document does seem to say that the Html class should be used instead of hardcoded HTML, but maybe that part could be clearer.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wp7kzldzuigdbsbg","postId": "wp7kzldzumefjw9o","isMaxThreadingDepth":false,"creator":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title":"User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"isNewPage":false,"replies":[]},"wp84f6t8k9eizygi":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wp7kzldzuigdbsbg","articleTitle":"Topic:Wp7kzldzuigdbsbg","revisionId":"wp84f6t8k9eizygi","timestamp":"20220201201855","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wp7kzldzuigdbsbg","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_showPostId=wp84f6t8k9eizygi#flow-post-wp84f6t8k9eizygi","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_postId=wp84f6t8k9eizygi\u0026topic_revId=wp84f6t8k9eizygi\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=reply\u0026topic_postId=wp84f6t8k9eizygi#flow-post-wp84f6t8k9eizygi","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"197"},"author":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false, "isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,197,0,0]}\"\u003EGiven that OOUI is now deprecated, I think we should avoid giving that guidance right now. But sadly the alternative (Codex) isn't ready and a server-side-rendering system certainly isn't. Ah well.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wp7kzldzuigdbsbg","postId":"wp84f6t8k9eizygi","isMaxThreadingDepth":false,"creator":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true, "_BC_bools":["exists"]}},"id":574543},"isNewPage":false,"replies":[]},"wp8ovftzfnrjyo0s":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wp7kzldzuigdbsbg","articleTitle":"Topic:Wp7kzldzuigdbsbg","revisionId":"wp8ovftzfnrjyo0s","timestamp":"20220202022609","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wp7kzldzuigdbsbg","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_showPostId=wp8ovftzfnrjyo0s#flow-post-wp8ovftzfnrjyo0s","title":"post","text":"post"},"post-revision":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_postId=wp8ovftzfnrjyo0s\u0026topic_revId=wp8ovftzfnrjyo0s\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=reply\u0026topic_postId=wp8ovftzfnrjyo0s#flow-post-wp8ovftzfnrjyo0s","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"829"},"author":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url": "/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title":"User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,254,0,0]}\"\u003EI didn't know OOUI was actually deprecated. Not to get into in a side issue, but is it really officially deprecated, or is it just sort of implicit that, given that a competing library is being developed, OOUI is not going to get much attention any more?\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[256,829,0,0]}\"\u003EIn any case, this doesn't seem like a satisfactory answer. If an extension's interface is going to adhere to the \u003Ca rel=\"mw:ExtLink\" href=\"https://design.wikimedia.org/style-guide/\" class=\"external text\" data-parsoid=\"{\u0026quot;dsr\u0026quot;:[369,441,43,1]}\"\u003EWikimedia Design Style Guide\u003C/a\u003E (which is also not mentioned in this document, by the way), OOUI is still the easiest way to achieve that, as far as I know. Let me ask this: if a new extension were created today for use on Wikipedia or other Wikimedia sites, and it contained form elements, how would its UI be coded so that it matched the style guide? Or would it simply have the default HTML gray buttons? (Doubtful.)\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wp7kzldzuigdbsbg","postId":"wp8ovftzfnrjyo0s","isMaxThreadingDepth":false,"creator":{"name":"Yaron Koren","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Yaron_Koren","title":"Contributions/Yaron Koren","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Yaron_Koren","title":"Yaron Koren","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Yaron_Koren","title":"User talk:Yaron Koren","exists":true,"_BC_bools":["exists"]}},"id":15560},"isNewPage":false,"replies":[]},"wpdnr8rcnnv50lid":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wp7kzldzuigdbsbg","articleTitle":"Topic:Wp7kzldzuigdbsbg","revisionId":"wpdnr8rcnnv50lid","timestamp":"20220204075815","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false, "links":{"topic-history":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wp7kzldzuigdbsbg","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_showPostId=wpdnr8rcnnv50lid#flow-post-wpdnr8rcnnv50lid","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_postId=wpdnr8rcnnv50lid\u0026topic_revId=wpdnr8rcnnv50lid\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=reply\u0026topic_postId=wpdnr8rcnnv50lid#flow-post-wpdnr8rcnnv50lid","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"450"},"author":{"name":"Legoktm","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Legoktm","title":"Contributions/Legoktm","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Legoktm","title":"Legoktm","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Legoktm","title":"User talk:Legoktm","exists":true,"_BC_bools":["exists"]}},"id":31711},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false,"isModeratedNotLocked":false,"content":{"content": "\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,144,0,0]}\"\u003ERe: OOUI's deprecation, see \u003Ca rel=\"mw:WikiLink/Interwiki\" href=\"https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/message/SOZREBYR36PUNFZXMIUBVAIOQI4N7PDU\" title=\"listarchive:list/wikitech-l@lists.wikimedia.org/message/SOZREBYR36PUNFZXMIUBVAIOQI4N7PDU\" class=\"extiw\" data-parsoid=\"{\u0026quot;stx\u0026quot;:\u0026quot;piped\u0026quot;,\u0026quot;a\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/message/SOZREBYR36PUNFZXMIUBVAIOQI4N7PDU\u0026quot;},\u0026quot;sa\u0026quot;:{\u0026quot;href\u0026quot;:\u0026quot;listarchive:list/wikitech-l@lists.wikimedia.org/message/SOZREBYR36PUNFZXMIUBVAIOQI4N7PDU\u0026quot;},\u0026quot;isIW\u0026quot;:true,\u0026quot;dsr\u0026quot;:[28,143,91,2]}\"\u003Ethis wikitech-l thread\u003C/a\u003E.\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[146,450,0,0]}\"\u003EMy understanding is that practically a new MediaWiki extension would most likely use OOUI because it has the most comprehensive widget library and is well integrated into everything...Codex isn't there yet AIUI. I think leaving that as a TODO or even a note on the page saying it's in flux would be okay.\u003C/p\u003E\u003C/section\u003E" ,"format":"fixed-html"},"watchable":false,"replyToId":"wp7kzldzuigdbsbg","postId":"wpdnr8rcnnv50lid","isMaxThreadingDepth":false,"creator":{"name":"Legoktm","wiki":"mediawikiwiki","gender":"male","links":{"contribs":{"url":"/wiki/Special:Contributions/Legoktm","title":"Contributions/Legoktm","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Legoktm","title":"Legoktm","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Legoktm","title":"User talk:Legoktm","exists":true,"_BC_bools":["exists"]}},"id":31711},"isNewPage":false,"replies":[]},"wpecj1cjbkjy44qx":{"_BC_bools":["isOriginalContent","isModerated","isLocked","isModeratedNotLocked","isWatched","watchable","isMaxThreadingDepth","isNewPage"],"workflowId":"wp7kzldzuigdbsbg","articleTitle":"Topic:Wp7kzldzuigdbsbg","revisionId":"wpecj1cjbkjy44qx","timestamp":"20220204152304","changeType":"reply","dateFormats":[],"properties":[],"isOriginalContent":true,"isModerated":false,"links":{"topic-history":{"url" :"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=history","title":"History","text":"History"},"topic":{"url":"//www.mediawiki.org/wiki/Topic:Wp7kzldzuigdbsbg","title":"topic","text":"topic"},"post":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_showPostId=wpecj1cjbkjy44qx#flow-post-wpecj1cjbkjy44qx","title":"post","text":"post"},"post-revision":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026topic_postId=wpecj1cjbkjy44qx\u0026topic_revId=wpecj1cjbkjy44qx\u0026action=single-view","title":"post revision","text":"post revision"},"watch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=watch","title":"Watch","text":"Watch"},"unwatch-topic":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=unwatch","title":"Unwatch","text":"Unwatch"}},"actions":{"reply":{"url": "//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=reply\u0026topic_postId=wp7kzldzuigdbsbg#flow-post-wp7kzldzuigdbsbg","title":"Reply","text":"Reply"},"summarize":{"url":"//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg\u0026action=edit-topic-summary","title":"Summarize","text":"Summarize"}},"size":{"old":"0","new":"363"},"author":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"lastEditUser":{"name":null,"wiki":null,"gender":"unknown","links":[],"id":null},"lastEditId":null,"previousRevisionId":null,"isLocked":false, "isModeratedNotLocked":false,"content":{"content":"\u003Csection data-mw-section-id=\"0\" data-parsoid=\"{}\"\u003E\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[0,215,0,0]}\"\u003ECodex is currently technically vapourware (there's not even an alpha release), but I have faith that it'll be usable for JS-only interfaces in the next few months (disclaimer: my team are one of those trialling it).\u003C/p\u003E\n\n\u003Cp data-parsoid=\"{\u0026quot;dsr\u0026quot;:[217,363,0,0]}\"\u003ECodex-with-SSR (which could be used for non-JS users and to avoid FOUC) is ultra-vapourware with no plan let alone code written. It'll be a while.\u003C/p\u003E\u003C/section\u003E","format":"fixed-html"},"watchable":false,"replyToId":"wp7kzldzuigdbsbg","postId":"wpecj1cjbkjy44qx","isMaxThreadingDepth":false,"creator":{"name":"Jdforrester (WMF)","wiki":"mediawikiwiki","gender":"unknown","links":{"contribs":{"url":"/wiki/Special:Contributions/Jdforrester_(WMF)","title":"Contributions/Jdforrester (WMF)", "exists":true,"_BC_bools":["exists"]},"userpage":{"url":"/wiki/User:Jdforrester_(WMF)","title":"Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]},"talk":{"url":"/wiki/User_talk:Jdforrester_(WMF)","title":"User talk:Jdforrester (WMF)","exists":true,"_BC_bools":["exists"]}},"id":574543},"isNewPage":false,"replies":[]}},"workflowId":"u3zld3xbhh9t5t0y","title":"Talk:Best practices for extensions","actions":{"newtopic":{"url":"//www.mediawiki.org/w/index.php?title=Talk:Best_practices_for_extensions\u0026action=new-topic","title":"Start a new topic","text":"Start a new topic"}},"links":{"board-sort":{"updated":"/w/index.php?title=Talk:Best_practices_for_extensions\u0026topiclist_sortby=updated\u0026topiclist_savesortby=1","newest":"/w/index.php?title=Talk:Best_practices_for_extensions\u0026topiclist_sortby=newest\u0026topiclist_savesortby=1"},"newtopic":"/w/index.php?title=Talk:Best_practices_for_extensions\u0026action=new-topic","pagination":{"fwd":{"url": "//www.mediawiki.org/w/index.php?title=Talk:Best_practices_for_extensions\u0026topiclist_offset-dir=fwd\u0026topiclist_limit=10\u0026topiclist_offset=20220127024916\u0026topiclist_sortby=updated","title":"fwd","text":"fwd"}}},"type":"topiclist","block-action-template":"","editToken":null,"editFont":"monospace"}},"isWatched":false,"watchable":false,"links":{"watch-board":{"url":"/w/index.php?title=Talk:Best_practices_for_extensions\u0026action=watch"},"unwatch-board":{"url":"/w/index.php?title=Talk:Best_practices_for_extensions\u0026action=unwatch"}},"toc":{"submitted":{"action":"view","toconly":true,"limit":50,"sortby":"updated"},"errors":[],"sortby":"updated","type":"topiclist","roots":["y30g8almolxpfjcg","wqvqvhgsvpu1je15","ur1vlumaj7yboynl","uxot1wc2nefkjbwo","wovr2kqb7qwhztwu","wp7kzldzuigdbsbg","wp7lbx9iay3b93my","uwqk40oa4gei3h9m","uxojqdvbtjpbbb94","uwqjvrjzh84larvx","ugsgpy9ohozv84du","w5nd2pqcfisbeoec","v0ydd9s88w6y4t4b","u3zld4039d3atquq","udq5gad69kqyy4ls","uqzvhcxmwqes3sv3" ,"ukahpsrm8ba6xn79","ugpw2635x8nzzp3z"],"posts":{"y30g8almolxpfjcg":["y30k9jo4tdp768nr"],"wqvqvhgsvpu1je15":["wqvuu2axkjdp8uka"],"ur1vlumaj7yboynl":["wr0i8lkz6xc02097"],"uxot1wc2nefkjbwo":["wr0i74njq3y2nho2"],"wovr2kqb7qwhztwu":["wovr2kqb7svj3vvy"],"wp7kzldzuigdbsbg":["wp7kzldzukfefuak"],"wp7lbx9iay3b93my":["wpa3epq1gwv527ew"],"uwqk40oa4gei3h9m":["wovd2orz2q3be7or"],"uxojqdvbtjpbbb94":["wovd0g6ktegst8up"],"uwqjvrjzh84larvx":["wovcztbrv6bqc8xu"],"ugsgpy9ohozv84du":["wovcx6anqay6uv7x"],"w5nd2pqcfisbeoec":["wgptd4mpaxhpwheq"],"v0ydd9s88w6y4t4b":["v0ydd9s88y5z8v3f"],"u3zld4039d3atquq":["ux226yyv7b88riy5"],"udq5gad69kqyy4ls":["ux22663jfp4e8v29"],"uqzvhcxmwqes3sv3":["us259ruev96latkp"],"ukahpsrm8ba6xn79":["ukdp0czfpjhemdrt"],"ugpw2635x8nzzp3z":["ugtcja8zpxkchhtu"]},"revisions":{"y30k9jo4tdp768nr":{"content":{"content":"bad links for doclink/html and doclink/Sanitizer","format":"topic-title-wikitext","plaintext":"bad links for doclink/html and doclink/Sanitizer"},"last_updated":1713267948000, "isModerated":true,"moderateState":"lock"},"wqvuu2axkjdp8uka":{"content":{"content":"Confusing A11y guideline about ids","format":"topic-title-wikitext","plaintext":"Confusing A11y guideline about ids"},"last_updated":1648483024000,"isModerated":false},"wr0i8lkz6xc02097":{"content":{"content":"Rating for \"uninstallation maintenance scripts\"","format":"topic-title-wikitext","plaintext":"Rating for \"uninstallation maintenance scripts\""},"last_updated":1646243912000,"isModerated":true,"moderateState":"lock"},"wr0i74njq3y2nho2":{"content":{"content":"Avoid global state","format":"topic-title-wikitext","plaintext":"Avoid global state"},"last_updated":1646243868000,"isModerated":true,"moderateState":"lock"},"wovr2kqb7svj3vvy":{"content":{"content":"What is this page's scope?","format":"topic-title-wikitext","plaintext":"What is this page's scope?"},"last_updated":1643996381000,"isModerated":false},"wp7kzldzukfefuak":{"content":{"content":"OOUI","format":"topic-title-wikitext","plaintext" :"OOUI"},"last_updated":1643988184000,"isModerated":false},"wpa3epq1gwv527ew":{"content":{"content":"\"Regularly submit and receive translations from translatewiki.net\"","format":"topic-title-wikitext","plaintext":"\"Regularly submit and receive translations from translatewiki.net\""},"last_updated":1643823215000,"isModerated":true,"moderateState":"lock"},"wovd2orz2q3be7or":{"content":{"content":"Don't: directly construct service objects","format":"topic-title-wikitext","plaintext":"Don't: directly construct service objects"},"last_updated":1643251842000,"isModerated":true,"moderateState":"lock"},"wovd0g6ktegst8up":{"content":{"content":"Deprecate /includes","format":"topic-title-wikitext","plaintext":"Deprecate /includes"},"last_updated":1643251775000,"isModerated":true,"moderateState":"lock"},"wovcztbrv6bqc8xu":{"content":{"content":"Don't: subclass anything not intended to be subclassed by extensions","format":"topic-title-wikitext","plaintext": "Don't: subclass anything not intended to be subclassed by extensions"},"last_updated":1643251756000,"isModerated":true,"moderateState":"lock"},"wovcx6anqay6uv7x":{"content":{"content":"Version numbers in all files?","format":"topic-title-wikitext","plaintext":"Version numbers in all files?"},"last_updated":1643251677000,"isModerated":true,"moderateState":"lock"},"wgptd4mpaxhpwheq":{"content":{"content":"Location for Mustache files","format":"topic-title-wikitext","plaintext":"Location for Mustache files"},"last_updated":1631866369000,"isModerated":false},"v0ydd9s88y5z8v3f":{"content":{"content":"Location for source JS files and JS build artifacts","format":"topic-title-wikitext","plaintext":"Location for source JS files and JS build artifacts"},"last_updated":1559639420000,"isModerated":false},"ux226yyv7b88riy5":{"content":{"content":"Namespacing extensions","format":"topic-title-wikitext","plaintext":"Namespacing extensions"},"last_updated":1554149149000,"isModerated":true, "moderateState":"lock"},"ux22663jfp4e8v29":{"content":{"content":"Don't overuse private visibility in services","format":"topic-title-wikitext","plaintext":"Don't overuse private visibility in services"},"last_updated":1554149125000,"isModerated":true,"moderateState":"lock"},"us259ruev96latkp":{"content":{"content":"Injecting a logging channel for a class: Through constructor injection or setter injection?","format":"topic-title-wikitext","plaintext":"Injecting a logging channel for a class: Through constructor injection or setter injection?"},"last_updated":1547171022000,"isModerated":true,"moderateState":"lock"},"ukdp0czfpjhemdrt":{"content":{"content":"Place for maintenance scripts","format":"topic-title-wikitext","plaintext":"Place for maintenance scripts"},"last_updated":1536448622000,"isModerated":true,"moderateState":"lock"},"ugtcja8zpxkchhtu":{"content":{"content":"Align language to RFC 2119?","format":"topic-title-wikitext","plaintext":"Align language to RFC 2119?"}, "last_updated":1531470601000,"isModerated":true,"moderateState":"lock"}},"links":{"pagination":[]}}},"wgEditSubmitButtonLabelPublish":true,"wgCentralAuthMobileDomain":false,"wgULSPosition":"personal","wgULSisCompactLinksEnabled":true,"wgVector2022LanguageInHeader":false,"wgULSisLanguageSelectorEmpty":true,"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","oojs-ui-core.styles":"ready","oojs-ui.styles.indicators":"ready","mediawiki.widgets.styles":"ready","oojs-ui-core.icons":"ready","mediawiki.ui":"ready","mediawiki.ui.button":"ready","mediawiki.ui.input":"ready","mediawiki.ui.icon":"ready","mediawiki.special.changeslist":"ready","mediawiki.interface.helpers.styles":"ready","mediawiki.editfont.styles":"ready","ext.flow.styles.base":"ready", "ext.flow.mediawiki.ui.form":"ready","oojs-ui.styles.icons-alerts":"ready","oojs-ui.styles.icons-content":"ready","oojs-ui.styles.icons-layout":"ready","oojs-ui.styles.icons-movement":"ready","oojs-ui.styles.icons-interactions":"ready","oojs-ui.styles.icons-editing-core":"ready","oojs-ui.styles.icons-moderation":"ready","mediawiki.skinning.content.parsoid":"ready","ext.cite.parsoid.styles":"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","ext.wikimediaBadges":"ready","ext.jsonConfig":"ready"};RLPAGEMODULES=["ext.flow","site","mediawiki.page.ready","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.urlShortener.toolbar","ext.centralauth.centralautologin","mmv.bootstrap","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth", "ext.thanks.flowthank","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.compactlinks","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.cite.parsoid.styles%7Cext.flow.mediawiki.ui.form%7Cext.flow.styles.base%7Cext.jsonConfig%2CwikimediaBadges%7Cext.uls.pt%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cmediawiki.editfont.styles%7Cmediawiki.interface.helpers.styles%7Cmediawiki.skinning.content.parsoid%7Cmediawiki.special.changeslist%7Cmediawiki.ui%7Cmediawiki.ui.button%2Cicon%2Cinput%7Cmediawiki.widgets.styles%7Coojs-ui-core.icons%2Cstyles%7Coojs-ui.styles.icons-alerts%2Cicons-content%2Cicons-editing-core%2Cicons-interactions%2Cicons-layout%2Cicons-moderation%2Cicons-movement%2Cindicators%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles&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:site_name" content="MediaWiki"> <meta property="og:title" content="Talk:Best practices for extensions - MediaWiki"> <meta property="og:type" content="website"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//m.mediawiki.org/wiki/Talk:Best_practices_for_extensions"> <link rel="alternate" type="application/x-wiki" title="Edit" href="/w/index.php?title=Talk:Best_practices_for_extensions&action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/mediawiki.png"> <link rel="icon" href="/static/favicon/mediawiki.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="MediaWiki (en)"> <link rel="EditURI" type="application/rsd+xml" href="//www.mediawiki.org/w/api.php?action=rsd"> <link rel="canonical" href="https://www.mediawiki.org/wiki/Talk:Best_practices_for_extensions"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"> <link rel="alternate" type="application/atom+xml" title="MediaWiki Atom feed" href="/w/index.php?title=Special:RecentChanges&feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-1 ns-talk mw-editable page-Talk_Best_practices_for_extensions rootpage-Talk_Best_practices_for_extensions 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/MediaWiki" title="Visit the main page [z]" accesskey="z"><span>Main page</span></a></li><li id="n-mw-download" class="mw-list-item"><a href="/wiki/Download"><span>Get MediaWiki</span></a></li><li id="n-mw-extensions" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Category:Extensions"><span>Get extensions</span></a></li><li id="n-blog-text" class="mw-list-item"><a href="https://techblog.wikimedia.org/"><span>Tech blog</span></a></li><li id="n-mw-contribute" class="mw-list-item"><a href="/wiki/Special:MyLanguage/How_to_contribute"><span>Contribute</span></a></li> </ul> </div> </div> <div id="p-support" class="vector-menu mw-portlet mw-portlet-support" > <div class="vector-menu-heading"> Support </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-help" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Help:Contents" title="The place to find out"><span>User help</span></a></li><li id="n-mw-faq" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Manual:FAQ"><span>FAQ</span></a></li><li id="n-mw-manual" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Manual:Contents"><span>Technical manual</span></a></li><li id="n-mw-supportdesk" class="mw-list-item"><a href="/wiki/Project:Support_desk"><span>Support desk</span></a></li><li id="n-mw-communication" class="mw-list-item"><a href="/wiki/Special:MyLanguage/Communication"><span>Communication</span></a></li> </ul> </div> </div> <div id="p-development" class="vector-menu mw-portlet mw-portlet-development" > <div class="vector-menu-heading"> Development </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mw-developerportal" class="mw-list-item"><a href="https://developer.wikimedia.org/"><span>Developer portal</span></a></li><li id="n-svn-statistics" class="mw-list-item"><a href="/wiki/Development_statistics"><span>Code statistics</span></a></li> </ul> </div> </div> <div id="p-mediawiki.org" class="vector-menu mw-portlet mw-portlet-mediawiki_org" > <div class="vector-menu-heading"> mediawiki.org </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-portal" class="mw-list-item"><a href="/wiki/Project:Help" title="About the project, what you can do, where to find things"><span>Community portal</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-mw-translate" class="mw-list-item"><a href="/wiki/Special:LanguageStats"><span>Translate content</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-mw-discussion" class="mw-list-item"><a href="/wiki/Project:Village_Pump"><span>Village pump</span></a></li><li id="n-Sandboxlink-portlet-label" class="mw-list-item"><a href="/wiki/Project:Sandbox"><span>Sandbox</span></a></li> </ul> </div> </div> <div id="vector-main-menu" class="vector-menu " > <div class="vector-menu-heading"> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/MediaWiki" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/mediawikiwiki.svg" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="MediaWiki" src="/static/images/mobile/copyright/mediawikiwiki-wordmark.svg" style="width: 7.5em; height: 1.125em;"> </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 MediaWiki [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 MediaWiki" aria-label="Search MediaWiki" autocapitalize="sentences" title="Search MediaWiki [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="https://donate.wikimedia.org/?utm_source=donate&utm_medium=sidebar&utm_campaign=spontaneous&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=Talk%3ABest+practices+for+extensions" 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=Talk%3ABest+practices+for+extensions" 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" 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="https://donate.wikimedia.org/?utm_source=donate&utm_medium=sidebar&utm_campaign=spontaneous&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=Talk%3ABest+practices+for+extensions" 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=Talk%3ABest+practices+for+extensions" 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 id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Pages for logged out editors <a href="/wiki/Help:Introduction" aria-label="Learn more about editing"><span>learn more</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</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> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <h1 id="firstHeading" class="firstHeading mw-first-heading">Talk:Best practices for extensions</h1> <div class="mw-indicators"> </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="vector-tab-noicon mw-list-item"><a href="/wiki/Best_practices_for_extensions" title="View the content page [c]" accesskey="c"><span>Page</span></a></li><li id="ca-talk" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Talk:Best_practices_for_extensions" rel="discussion" 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-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Talk:Best_practices_for_extensions&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-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Talk:Best_practices_for_extensions&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/Talk:Best_practices_for_extensions" 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/Talk:Best_practices_for_extensions" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard" title="Upload files [u]" accesskey="u"><span>Upload file</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-info" class="mw-list-item"><a href="/w/index.php?title=Talk:Best_practices_for_extensions&action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fwww.mediawiki.org%2Fwiki%2FTalk%3ABest_practices_for_extensions"><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%2Fwww.mediawiki.org%2Fwiki%2FTalk%3ABest_practices_for_extensions"><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=Talk%3ABest+practices+for+extensions"><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=Talk%3ABest_practices_for_extensions&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=Talk:Best_practices_for_extensions&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> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="mw-content-text" class="mw-body-content"><div class="flow-component flow-board-page mw-content-ltr flow-action-view" data-flow-component="board" data-flow-id="u3zld3xbhh9t5t0y"> <div class="flow-board-header flow-load-interactive" data-flow-load-handler="loadSideRail"> <h2 class="flow-board-header-title mw-ui-icon mw-ui-icon-before mw-ui-icon-speechBubbles"> About this board </h2> <div class="flow-error-container"> </div> <div id='flow-board-description' class='oo-ui-widget oo-ui-widget-enabled flow-ui-boardDescriptionWidget flow-ui-boardDescriptionWidget-nojs'><div><span class='flow-ui-boardDescriptionWidget-editButton oo-ui-widget oo-ui-widget-enabled oo-ui-buttonElement oo-ui-buttonElement-frameless oo-ui-iconElement oo-ui-labelElement oo-ui-flaggedElement-progressive oo-ui-buttonWidget'><a role='button' tabindex='0' href='//www.mediawiki.org/w/index.php?title=Talk:Best_practices_for_extensions&action=edit-header' rel='nofollow' class='oo-ui-buttonElement-button'><span class='oo-ui-iconElement-icon oo-ui-icon-edit oo-ui-image-progressive'></span><span class='oo-ui-labelElement-label'>Edit description</span><span class='oo-ui-indicatorElement-indicator oo-ui-indicatorElement-noIndicator oo-ui-image-progressive'></span></a></span></div><div class='flow-ui-boardDescriptionWidget-content mw-parser-output'></div></div> <a href="javascript:void(0);" role="button" class="mw-ui-button mw-ui-quiet side-rail-toggle-button" data-flow-interactive-handler="toggleSideRail"> <span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-close pull-right collapse-button" title="Hide description"></span> <span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-speechBubbles pull-right expand-button" title="Show description"></span> </a> <div class="flow-board-header-footer"> <hr /> <p> </p> </div> </div> <div class="flow-board-navigation" data-flow-load-handler="boardNavigation"> <div class="flow-error-container"> </div> </div> <div class="flow-board" data-flow-sortby="updated"> <div class="flow-newtopic-container"> <div class="flow-nojs"> <a class="mw-ui-input mw-ui-input-large flow-ui-input-replacement-anchor" href="/w/index.php?title=Talk:Best_practices_for_extensions&action=new-topic">Start a new topic</a> </div> <div class="flow-js"> <form action="//www.mediawiki.org/w/index.php?title=Talk:Best_practices_for_extensions&action=new-topic" method="POST" class="flow-newtopic-form"> <div class="flow-error-container"> </div> <div class="flow-anon-warning"> <div class="flow-anon-warning-mobile"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-down flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <div class="flow-anon-warning-desktop"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-left flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> </script></div> <input type="hidden" name="wpEditToken" value="+\" /> <input type="hidden" name="topiclist_replyTo" value="u3zld3xbhh9t5t0y" /> <input name="topiclist_topic" class="mw-ui-input mw-ui-input-large" required type="text" placeholder="Start a new topic" data-role="title" /> </form> </div> </div> <div class="flow-topics"> <div class="flow-topic flow-load-interactive flow-topic-moderatestate-lock flow-topic-moderated flow-element-collapsible flow-element-collapsed" id="flow-topic-y30g8almolxpfjcg" data-flow-id="y30g8almolxpfjcg" data-flow-load-handler="topic" data-flow-toc-scroll-target=".flow-topic-titlebar" data-flow-topic-timestamp-updated="1713267948000" > <div class="flow-topic-titlebar"> <div class="flow-topic-titlebar-container"> <h2 class="flow-topic-title flow-load-interactive flow-collapse-toggle flow-click-interactive" data-flow-topic-title="bad links for doclink/html and doclink/Sanitizer" data-flow-load-handler="topicTitle" data-flow-interactive-handler="collapserCollapsibleToggle" > <span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-check"></span> bad links for doclink/html and doclink/Sanitizer</h2> <div class="flow-topic-meta"> <a class="expand-collapse-posts-link flow-collapse-toggle flow-click-interactive" href="javascript:void(0);" title="View comments" data-collapsed-title="View comments" data-expanded-title="Hide comments" data-flow-interactive-handler="collapserCollapsibleToggle" >2 comments</a> • <a href="//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg&action=history" class="flow-timestamp-anchor"> <span datetime="1713267948" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">11:45, 16 April 2024</span> <span id="" class="flow-timestamp-ago">7 months ago</span> </span> </a> </div> <span class="flow-reply-count"><span class="flow-reply-count-number">2</span></span> </div> <div class="flow-topic-summary-container flow-collapse-toggle flow-click-interactive" data-flow-interactive-handler="collapserCollapsibleToggle" > <div class="flow-error-container"> </div> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show topic action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg&action=history"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-clock"><span>History</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/wiki/Topic:Y30g8almolxpfjcg"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <!-- eachPost topic --> <div id="flow-post-y30g8almopvrnnao" class="flow-post" data-flow-id="y30g8almopvrnnao" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Wladek92" class="mw-userlink"> <bdi>Wladek92</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Wladek92" class="" title="User talk:Wladek92">talk</a></span><span><a href="/wiki/Special:Contributions/Wladek92" title="Contributions/Wladek92">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" id="mwAQ"><p id="mwAg">the two targets of doclinks cannot be reached:</p> <p id="mwAw"><span typeof="mw:Nowiki" id="mwBA"><!--T:161--> Use MediaWiki's validation/sanitization methods ''e.g.'' those in the <tvar name=1>{{class doclink|Html}}</tvar> and <tvar name=2>{{class doclink|Sanitizer}}</tvar> classes.</span></p> <p id="mwBQ">please correct or realign, thanks --<a href="/wiki/User:Wladek92" title="User:Wladek92" rel="mw:WikiLink" id="mwBg">Christian 🇫🇷 FR</a> (<a href="/wiki/User_talk:Wladek92" title="User talk:Wladek92" rel="mw:WikiLink" id="mwBw">talk</a>) 10:33, 16 April 2024 (UTC)</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg&action=history" class="flow-timestamp-anchor"> <span datetime="1713263601" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">10:33, 16 April 2024</span> <span id="" class="flow-timestamp-ago">7 months ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg&topic_showPostId=y30g8almopvrnnao#flow-post-y30g8almopvrnnao"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-y30hzy5ipwb02g46" class="flow-post" data-flow-id="y30hzy5ipwb02g46" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:TheDJ" class="mw-userlink"> <bdi>TheDJ</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:TheDJ" class="" title="User talk:TheDJ">talk</a></span><span><a href="/wiki/Special:Contributions/TheDJ" title="Contributions/TheDJ">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" id="mwAQ"><p id="mwAg">done</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg&action=history" class="flow-timestamp-anchor"> <span datetime="1713265506" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">11:05, 16 April 2024</span> <span id="" class="flow-timestamp-ago">7 months ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Y30g8almolxpfjcg&topic_showPostId=y30hzy5ipwb02g46#flow-post-y30hzy5ipwb02g46"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <form class="flow-post flow-reply-form" method="POST" action="" id="flow-reply-y30g8almolxpfjcg" > <input type="hidden" name="wpEditToken" value="+\" /> <input type="hidden" name="topic_replyTo" value="y30g8almolxpfjcg" /> <div class="flow-error-container"> </div> <div class="flow-anon-warning"> <div class="flow-anon-warning-mobile"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-down flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <div class="flow-anon-warning-desktop"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-left flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> </flowprogressivescript></div> <div class="flow-editor"> <textarea id="flow-post-y30g8almolxpfjcg-form-content" name="topic_content" required class="mw-ui-input flow-click-interactive mw-editfont-monospace" type="text" placeholder="Reply to "bad links for doclink/html and doclink/Sanitizer"" data-role="content" ></textarea> </div> <div class="flow-form-actions flow-form-collapsible"> <button data-role="submit" class="mw-ui-button mw-ui-progressive" >Reply</button> <small class="flow-terms-of-use plainlinks">By clicking "Reply", you agree to our <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and agree to irrevocably release your text under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0 License</a> and <a class="external text" href="https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License">GFDL</a>.</small> </div> </form> </script></div> <div class="flow-topic flow-load-interactive" id="flow-topic-wqvqvhgsvpu1je15" data-flow-id="wqvqvhgsvpu1je15" data-flow-load-handler="topic" data-flow-toc-scroll-target=".flow-topic-titlebar" data-flow-topic-timestamp-updated="1648483024000" > <div class="flow-topic-titlebar"> <div class="flow-topic-titlebar-container"> <h2 class="flow-topic-title flow-load-interactive " data-flow-topic-title="Confusing A11y guideline about ids" data-flow-load-handler="topicTitle" > Confusing A11y guideline about ids</h2> <div class="flow-topic-meta"> 10 comments • <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=history" class="flow-timestamp-anchor"> <span datetime="1648483024" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">15:57, 28 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </div> <span class="flow-reply-count"><span class="flow-reply-count-number">10</span></span> </div> <div class="flow-topic-summary-container " > <div class="flow-error-container"> </div> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show topic action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=history"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-clock"><span>History</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/wiki/Topic:Wqvqvhgsvpu1je15"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet flow-ui-summarize-topic-link" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=edit-topic-summary"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-listBullet"><span>Summarize</span></span></a></li></section> <section></section> </ul> </div> </div> <!-- eachPost topic --> <div id="flow-post-wqvqvhgsvts3rhzd" class="flow-post" data-flow-id="wqvqvhgsvts3rhzd" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Michael_Gro%C3%9Fe_(WMDE)" class="mw-userlink"> <bdi>Michael Große (WMDE)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Michael_Gro%C3%9Fe_(WMDE)" class="" title="User talk:Michael Große (WMDE)">talk</a></span><span><a href="/wiki/Special:Contributions/Michael_Gro%C3%9Fe_(WMDE)" title="Contributions/Michael Große (WMDE)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,61,0,0]}">I'm confused by this item in the section about Accessibility:</p> <p data-parsoid="{"dsr":[62,63,0,0]}"> <br data-parsoid="{"dsr":[63,63,0,0]}"/></p> <blockquote data-parsoid="{"stx":"html","dsr":[64,280,12,13]}"><p data-parsoid="{"dsr":[76,267,0,0]}">SHOULD: HTML element's IDs should only be rarely, for things to which you can navigate. Everything else should be a class – even if you expect to use it only once, use a class name instead.</p></blockquote> <p data-parsoid="{"dsr":[281,502,0,0]}"> <br data-parsoid="{"dsr":[282,282,0,0]}"/> Why would that be an accessibility consideration? Most accessibility uses for ids aren't related to navigation and can't be replaced by classes (for example, the target of an <code data-parsoid="{"stx":"html","dsr":[458,491,6,7]}">aria-described-by=""</code> and such).</p> <p data-parsoid="{"dsr":[504,706,0,0]}">I can see that ids should not be used for styling, but that is not an accessibility concern. And I can see that ids must be unique, but that is a MUST and also affects much more than only accessibility.</p> <p data-parsoid="{"dsr":[707,737,0,0]}"> <br data-parsoid="{"dsr":[708,708,0,0]}"/> Am I missing something here?</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wqvqvhgsvts3rhzd#flow-post-wqvqvhgsvts3rhzd" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <span> Edited </span> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=compare-post-revisions&topic_newRevision=wqvqwjyk1u4y8hlo" class="flow-timestamp-anchor"> <span datetime="1646059319" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">14:41, 28 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&topic_showPostId=wqvqvhgsvts3rhzd#flow-post-wqvqvhgsvts3rhzd"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wqw6lnnhy3kgbuli" class="flow-post" data-flow-id="wqw6lnnhy3kgbuli" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:TheDJ" class="mw-userlink"> <bdi>TheDJ</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:TheDJ" class="" title="User talk:TheDJ">talk</a></span><span><a href="/wiki/Special:Contributions/TheDJ" title="Contributions/TheDJ">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,168,0,0]}">Correct. however those should generally be auto-generated ids (again to guarantee uniqueness), but yes, this is more of a code convention than an accessibility concern.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wqw6lnnhy3kgbuli#flow-post-wqw6lnnhy3kgbuli" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=history" class="flow-timestamp-anchor"> <span datetime="1646076231" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">19:23, 28 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&topic_showPostId=wqw6lnnhy3kgbuli#flow-post-wqw6lnnhy3kgbuli"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wqxfljr257j8ir7m" class="flow-post" data-flow-id="wqxfljr257j8ir7m" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:AKlapper_(WMF)" class="mw-userlink"> <bdi>AKlapper (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:AKlapper_(WMF)" class="" title="User talk:AKlapper (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/AKlapper_(WMF)" title="Contributions/AKlapper (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,204,0,0]}">I'd generally like to remove all content under <a href="/wiki/Best_practices_for_extensions#Accessibility" title="Best practices for extensions" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./Best_practices_for_extensions#Accessibility"},"sa":{"href":"Best practices for extensions#Accessibility"},"dsr":[47,94,2,2]}">Best practices for extensions#Accessibility</a> and instead link to <a href="/wiki/Accessibility_guide_for_developers" title="Accessibility guide for developers" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./Accessibility_guide_for_developers"},"sa":{"href":"Accessibility guide for developers"},"dsr":[115,153,2,2]}">Accessibility guide for developers</a> to avoid quadruplicating more and more guidelines.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wqxfljr257j8ir7m#flow-post-wqxfljr257j8ir7m" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=history" class="flow-timestamp-anchor"> <span datetime="1646124710" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">08:51, 1 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&topic_showPostId=wqxfljr257j8ir7m#flow-post-wqxfljr257j8ir7m"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wqztx8tryinygmbs" class="flow-post" data-flow-id="wqztx8tryinygmbs" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Michael_Gro%C3%9Fe_(WMDE)" class="mw-userlink"> <bdi>Michael Große (WMDE)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Michael_Gro%C3%9Fe_(WMDE)" class="" title="User talk:Michael Große (WMDE)">talk</a></span><span><a href="/wiki/Special:Contributions/Michael_Gro%C3%9Fe_(WMDE)" title="Contributions/Michael Große (WMDE)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,74,0,0]}"><span about="#mwt1" typeof="mw:Transclusion" data-parsoid="{"pi":[[{"k":"1"}]],"dsr":[0,30,null,null]}" data-mw="{"parts":[{"template":{"target":{"wt":"FlowMention","href":"./Template:FlowMention"},"params":{"1":{"wt":"AKlapper (WMF)"}},"i":0}}]}">@</span><a href="/wiki/User:AKlapper_(WMF)" title="User:AKlapper (WMF)" rel="mw:WikiLink" about="#mwt1" data-parsoid="{"stx":"piped","a":{"href":"./User:AKlapper_(WMF)"},"sa":{"href":"User:AKlapper (WMF)"}}">AKlapper (WMF)</a> That sounds like a sensible approach to me.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wqztx8tryinygmbs#flow-post-wqztx8tryinygmbs" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <span> Edited </span> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=compare-post-revisions&topic_newRevision=wqztxig8eov8d5gw" class="flow-timestamp-anchor"> <span datetime="1646217723" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">10:42, 2 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&topic_showPostId=wqztx8tryinygmbs#flow-post-wqztx8tryinygmbs"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wr01pzpsxubdhhxt" class="flow-post" data-flow-id="wr01pzpsxubdhhxt" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:AKlapper_(WMF)" class="mw-userlink"> <bdi>AKlapper (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:AKlapper_(WMF)" class="" title="User talk:AKlapper (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/AKlapper_(WMF)" title="Contributions/AKlapper (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,5,0,0]}">Done.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wr01pzpsxubdhhxt#flow-post-wr01pzpsxubdhhxt" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=history" class="flow-timestamp-anchor"> <span datetime="1646226117" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">13:01, 2 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&topic_showPostId=wr01pzpsxubdhhxt#flow-post-wr01pzpsxubdhhxt"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wr0ge8ldo1itlxrm" class="flow-post" data-flow-id="wr0ge8ldo1itlxrm" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Jdforrester_(WMF)" class="mw-userlink"> <bdi>Jdforrester (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Jdforrester_(WMF)" class="" title="User talk:Jdforrester (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Jdforrester_(WMF)" title="Contributions/Jdforrester (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,256,0,0]}">But none of that is written in terms of should/must, so now we're adding a fudge factor back into the process, whereas this entire document is meant to be a "one-stop-shop" where if you pass all the items you can be pretty sure you could as 'best practice.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wr0ge8ldo1itlxrm#flow-post-wr0ge8ldo1itlxrm" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=history" class="flow-timestamp-anchor"> <span datetime="1646241926" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">17:25, 2 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&topic_showPostId=wr0ge8ldo1itlxrm#flow-post-wr0ge8ldo1itlxrm"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wr0h57cgmyhlw6ld" class="flow-post" data-flow-id="wr0h57cgmyhlw6ld" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:AKlapper_(WMF)" class="mw-userlink"> <bdi>AKlapper (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:AKlapper_(WMF)" class="" title="User talk:AKlapper (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/AKlapper_(WMF)" title="Contributions/AKlapper (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,99,0,0]}"><span about="#mwt1" typeof="mw:Transclusion" data-parsoid="{"pi":[[{"k":"1"}]],"dsr":[0,33,null,null]}" data-mw="{"parts":[{"template":{"target":{"wt":"FlowMention","href":"./Template:FlowMention"},"params":{"1":{"wt":"Jdforrester (WMF)"}},"i":0}}]}">@</span><a href="/wiki/User:Jdforrester_(WMF)" title="User:Jdforrester (WMF)" rel="mw:WikiLink" about="#mwt1" data-parsoid="{"stx":"piped","a":{"href":"./User:Jdforrester_(WMF)"},"sa":{"href":"User:Jdforrester (WMF)"}}">Jdforrester (WMF)</a> Please feel free to edit it and define MUSTs and SHOULDs. Thanks!</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wr0h57cgmyhlw6ld#flow-post-wr0h57cgmyhlw6ld" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=history" class="flow-timestamp-anchor"> <span datetime="1646242733" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">17:38, 2 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&topic_showPostId=wr0h57cgmyhlw6ld#flow-post-wr0h57cgmyhlw6ld"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wr0i9fnl1dopx6we" class="flow-post" data-flow-id="wr0i9fnl1dopx6we" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Jdforrester_(WMF)" class="mw-userlink"> <bdi>Jdforrester (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Jdforrester_(WMF)" class="" title="User talk:Jdforrester (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Jdforrester_(WMF)" title="Contributions/Jdforrester (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,64,0,0]}">I'd rather you did that, as the editor of this area here, Andre.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wr0i9fnl1dopx6we#flow-post-wr0i9fnl1dopx6we" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=history" class="flow-timestamp-anchor"> <span datetime="1646243937" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">17:58, 2 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&topic_showPostId=wr0i9fnl1dopx6we#flow-post-wr0i9fnl1dopx6we"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wsm58zwb72uarhpw" class="flow-post" data-flow-id="wsm58zwb72uarhpw" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Jdforrester_(WMF)" class="mw-userlink"> <bdi>Jdforrester (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Jdforrester_(WMF)" class="" title="User talk:Jdforrester (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Jdforrester_(WMF)" title="Contributions/Jdforrester (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,99,0,0]}">OK, it's been a month, we can just revert your removal Andre if you don't have time to do the work?</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wsm58zwb72uarhpw#flow-post-wsm58zwb72uarhpw" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=history" class="flow-timestamp-anchor"> <span datetime="1648479494" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">14:58, 28 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&topic_showPostId=wsm58zwb72uarhpw#flow-post-wsm58zwb72uarhpw"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wsm8iy6ptpmd8gii" class="flow-post" data-flow-id="wsm8iy6ptpmd8gii" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:AKlapper_(WMF)" class="mw-userlink"> <bdi>AKlapper (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:AKlapper_(WMF)" class="" title="User talk:AKlapper (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/AKlapper_(WMF)" title="Contributions/AKlapper (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,256,0,0]}">Surely we can duplicate content (and likely make things go out of sync), however I don't think it's a good idea when there are already guidelines for an area to add yet another place with guidelines for that area. For the time being, feel free to go ahead.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wqvqvhgsvpu1je15#flow-post-wqvqvhgsvpu1je15" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=history" class="flow-timestamp-anchor"> <span datetime="1648483024" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">15:57, 28 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&topic_showPostId=wsm8iy6ptpmd8gii#flow-post-wsm8iy6ptpmd8gii"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="replace" data-target="~ a" > <form class="flow-post flow-reply-form" method="POST" action="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wqvqvhgsvpu1je15#flow-post-wqvqvhgsvpu1je15-form-content" id="flow-reply-wqvqvhgsvpu1je15" > <input type="hidden" name="wpEditToken" value="+\" /> <input type="hidden" name="topic_replyTo" value="wqvqvhgsvpu1je15" /> <div class="flow-error-container"> </div> <div class="flow-anon-warning"> <div class="flow-anon-warning-mobile"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-down flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <div class="flow-anon-warning-desktop"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-left flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> </flowprogressivescript></div> <div class="flow-editor"> <textarea id="flow-post-wqvqvhgsvpu1je15-form-content" name="topic_content" required class="mw-ui-input flow-click-interactive mw-editfont-monospace" type="text" placeholder="Reply to "Confusing A11y guideline about ids"" data-role="content" ></textarea> </div> <div class="flow-form-actions flow-form-collapsible"> <button data-role="submit" class="mw-ui-button mw-ui-progressive" >Reply</button> <small class="flow-terms-of-use plainlinks">By clicking "Reply", you agree to our <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and agree to irrevocably release your text under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0 License</a> and <a class="external text" href="https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License">GFDL</a>.</small> </div> </form> </script> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wqvqvhgsvpu1je15&action=reply&topic_postId=wqvqvhgsvpu1je15#flow-post-wqvqvhgsvpu1je15-form-content" title="Reply" class="flow-ui-input-replacement-anchor mw-ui-input" >Reply to "Confusing A11y guideline about ids"</a> </div> <div class="flow-topic flow-load-interactive flow-topic-moderatestate-lock flow-topic-moderated flow-element-collapsible flow-element-collapsed" id="flow-topic-ur1vlumaj7yboynl" data-flow-id="ur1vlumaj7yboynl" data-flow-load-handler="topic" data-flow-toc-scroll-target=".flow-topic-titlebar" data-flow-topic-timestamp-updated="1646243912000" > <div class="flow-topic-titlebar"> <div class="flow-topic-titlebar-container"> <h2 class="flow-topic-title flow-load-interactive flow-collapse-toggle flow-click-interactive" data-flow-topic-title="Rating for &quot;uninstallation maintenance scripts&quot;" data-flow-load-handler="topicTitle" data-flow-interactive-handler="collapserCollapsibleToggle" > <span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-check"></span> Rating for "uninstallation maintenance scripts"</h2> <div class="flow-topic-meta"> <a class="expand-collapse-posts-link flow-collapse-toggle flow-click-interactive" href="javascript:void(0);" title="View comments" data-collapsed-title="View comments" data-expanded-title="Hide comments" data-flow-interactive-handler="collapserCollapsibleToggle" >2 comments</a> • <a href="//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl&action=history" class="flow-timestamp-anchor"> <span datetime="1646243912" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">17:58, 2 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </div> <span class="flow-reply-count"><span class="flow-reply-count-number">2</span></span> </div> <div class="flow-topic-summary-container flow-collapse-toggle flow-click-interactive" data-flow-interactive-handler="collapserCollapsibleToggle" > <div class="flow-error-container"> </div> <div class="flow-topic-summary"> <div class="flow-topic-summary-author"> Summary by Krinkle </div> <div class="flow-topic-summary-content mw-parser-output"> <section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,5,0,0]}">Done.</p></section> </div> <div style="clear: both;"></div> </div> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show topic action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl&action=history"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-clock"><span>History</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/wiki/Topic:Ur1vlumaj7yboynl"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <!-- eachPost topic --> <div id="flow-post-ur1vlumajbwdx2lt" class="flow-post" data-flow-id="ur1vlumajbwdx2lt" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:SamanthaNguyen" class="mw-userlink"> <bdi>SamanthaNguyen</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:SamanthaNguyen" class="" title="User talk:SamanthaNguyen">talk</a></span><span><a href="/wiki/Special:Contributions/SamanthaNguyen" title="Contributions/SamanthaNguyen">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><p data-parsoid="{"dsr":[0,121,0,0]}">There's no rating for this item under the Database section. Is it something that must be done, should be, or recommended?</p></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl&action=history" class="flow-timestamp-anchor"> <span datetime="1545764321" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">18:58, 25 December 2018</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl&topic_showPostId=ur1vlumajbwdx2lt#flow-post-ur1vlumajbwdx2lt"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wovcw3sx8052esva" class="flow-post" data-flow-id="wovcw3sx8052esva" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Krinkle" class="mw-userlink"> <bdi>Krinkle</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Krinkle" class="" title="User talk:Krinkle">talk</a></span><span><a href="/wiki/Special:Contributions/Krinkle" title="Contributions/Krinkle">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,580,0,0]}">I didn't see this at the time, but I added "should" in front of it last year in <a rel="mw:ExtLink" href="https://www.mediawiki.org/w/index.php?title=Best_practices_for_extensions&diff=prev&oldid=4900262" class="external text" data-parsoid="{"dsr":[80,189,99,1]}">this edit</a> as part of a general formatting copy-fix. I didn't intentionally make a choice there. I've changed it to "optional" now because 1) This is something virtually no extension does today so it seems only right to begin there given that these are meant to reflect current practice, and 2) There is a related item about uninstall instructions under "Documentation" which is also optional already.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl&action=history" class="flow-timestamp-anchor"> <span datetime="1643251645" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">02:47, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Ur1vlumaj7yboynl&topic_showPostId=wovcw3sx8052esva#flow-post-wovcw3sx8052esva"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <form class="flow-post flow-reply-form" method="POST" action="" id="flow-reply-ur1vlumaj7yboynl" > <input type="hidden" name="wpEditToken" value="+\" /> <input type="hidden" name="topic_replyTo" value="ur1vlumaj7yboynl" /> <div class="flow-error-container"> </div> <div class="flow-anon-warning"> <div class="flow-anon-warning-mobile"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-down flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <div class="flow-anon-warning-desktop"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-left flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> </flowprogressivescript></div> <div class="flow-editor"> <textarea id="flow-post-ur1vlumaj7yboynl-form-content" name="topic_content" required class="mw-ui-input flow-click-interactive mw-editfont-monospace" type="text" placeholder="Reply to "Rating for "uninstallation maintenance scripts""" data-role="content" ></textarea> </div> <div class="flow-form-actions flow-form-collapsible"> <button data-role="submit" class="mw-ui-button mw-ui-progressive" >Reply</button> <small class="flow-terms-of-use plainlinks">By clicking "Reply", you agree to our <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and agree to irrevocably release your text under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0 License</a> and <a class="external text" href="https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License">GFDL</a>.</small> </div> </form> </script></div> <div class="flow-topic flow-load-interactive flow-topic-moderatestate-lock flow-topic-moderated flow-element-collapsible flow-element-collapsed" id="flow-topic-uxot1wc2nefkjbwo" data-flow-id="uxot1wc2nefkjbwo" data-flow-load-handler="topic" data-flow-toc-scroll-target=".flow-topic-titlebar" data-flow-topic-timestamp-updated="1646243868000" > <div class="flow-topic-titlebar"> <div class="flow-topic-titlebar-container"> <h2 class="flow-topic-title flow-load-interactive flow-collapse-toggle flow-click-interactive" data-flow-topic-title="Avoid global state" data-flow-load-handler="topicTitle" data-flow-interactive-handler="collapserCollapsibleToggle" > <span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-check"></span> Avoid global state</h2> <div class="flow-topic-meta"> <a class="expand-collapse-posts-link flow-collapse-toggle flow-click-interactive" href="javascript:void(0);" title="View comments" data-collapsed-title="View comments" data-expanded-title="Hide comments" data-flow-interactive-handler="collapserCollapsibleToggle" >3 comments</a> • <a href="//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo&action=history" class="flow-timestamp-anchor"> <span datetime="1646243868" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">17:57, 2 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </div> <span class="flow-reply-count"><span class="flow-reply-count-number">3</span></span> </div> <div class="flow-topic-summary-container flow-collapse-toggle flow-click-interactive" data-flow-interactive-handler="collapserCollapsibleToggle" > <div class="flow-error-container"> </div> <div class="flow-topic-summary"> <div class="flow-topic-summary-author"> Summary by Krinkle </div> <div class="flow-topic-summary-content mw-parser-output"> <section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,6,0,0]}">Added.</p></section> </div> <div style="clear: both;"></div> </div> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show topic action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo&action=history"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-clock"><span>History</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/wiki/Topic:Uxot1wc2nefkjbwo"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxot1wc2nidmrfuw" class="flow-post" data-flow-id="uxot1wc2nidmrfuw" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Smalyshev_(WMF)" class="mw-userlink"> <bdi>Smalyshev (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Smalyshev_(WMF)" class="" title="User talk:Smalyshev (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Smalyshev_(WMF)" title="Contributions/Smalyshev (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,426,0,0]}">One thing that should be avoided even more than global state (e.g. global variables/public static properties in classes) is local static vars and similar instances of hidden local state, especially when used for caching. It looks like a very good idea when writing it, and is absolute nightmare when debugging/testing, because it creates hidden un-clearable state which could be in any random configuration when you get to it.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo&action=history" class="flow-timestamp-anchor"> <span datetime="1555031374" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">01:09, 12 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo&topic_showPostId=uxot1wc2nidmrfuw#flow-post-uxot1wc2nidmrfuw"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uzc3sc6z23ylkzdo" class="flow-post" data-flow-id="uzc3sc6z23ylkzdo" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Thiemo_Kreuz_(WMDE)" class="mw-userlink"> <bdi>Thiemo Kreuz (WMDE)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Thiemo_Kreuz_(WMDE)" class="" title="User talk:Thiemo Kreuz (WMDE)">talk</a></span><span><a href="/wiki/Special:Contributions/Thiemo_Kreuz_(WMDE)" title="Contributions/Thiemo Kreuz (WMDE)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,144,0,0]}">There is an other document in the works at <a href="/wiki/User:DKinzler_(WMF)/Software_Design_Practices" title="User:DKinzler (WMF)/Software Design Practices" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./User:DKinzler_(WMF)/Software_Design_Practices"},"sa":{"href":"User:DKinzler (WMF)/Software Design Practices"},"dsr":[43,92,2,2]}">User:DKinzler (WMF)/Software Design Practices</a> that covers exactly this concern very well, I find.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo&action=history" class="flow-timestamp-anchor"> <span datetime="1557331301" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">16:01, 8 May 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo&topic_showPostId=uzc3sc6z23ylkzdo#flow-post-uzc3sc6z23ylkzdo"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wr0i728xgpgozp40" class="flow-post" data-flow-id="wr0i728xgpgozp40" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Krinkle" class="mw-userlink"> <bdi>Krinkle</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Krinkle" class="" title="User talk:Krinkle">talk</a></span><span><a href="/wiki/Special:Contributions/Krinkle" title="Contributions/Krinkle">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,178,0,0]}">I've made the point about global state explicit in <a rel="mw:ExtLink" href="https://www.mediawiki.org/w/index.php?title=Best_practices_for_extensions&type=revision&diff=5091662&oldid=5091658" class="external text" data-parsoid="{"dsr":[51,177,116,1]}">this edit</a>.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo&action=history" class="flow-timestamp-anchor"> <span datetime="1646243866" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">17:57, 2 March 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uxot1wc2nefkjbwo&topic_showPostId=wr0i728xgpgozp40#flow-post-wr0i728xgpgozp40"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <form class="flow-post flow-reply-form" method="POST" action="" id="flow-reply-uxot1wc2nefkjbwo" > <input type="hidden" name="wpEditToken" value="+\" /> <input type="hidden" name="topic_replyTo" value="uxot1wc2nefkjbwo" /> <div class="flow-error-container"> </div> <div class="flow-anon-warning"> <div class="flow-anon-warning-mobile"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-down flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <div class="flow-anon-warning-desktop"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-left flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> </flowprogressivescript></div> <div class="flow-editor"> <textarea id="flow-post-uxot1wc2nefkjbwo-form-content" name="topic_content" required class="mw-ui-input flow-click-interactive mw-editfont-monospace" type="text" placeholder="Reply to "Avoid global state"" data-role="content" ></textarea> </div> <div class="flow-form-actions flow-form-collapsible"> <button data-role="submit" class="mw-ui-button mw-ui-progressive" >Reply</button> <small class="flow-terms-of-use plainlinks">By clicking "Reply", you agree to our <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and agree to irrevocably release your text under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0 License</a> and <a class="external text" href="https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License">GFDL</a>.</small> </div> </form> </script></div> <div class="flow-topic flow-load-interactive" id="flow-topic-wovr2kqb7qwhztwu" data-flow-id="wovr2kqb7qwhztwu" data-flow-load-handler="topic" data-flow-toc-scroll-target=".flow-topic-titlebar" data-flow-topic-timestamp-updated="1643996381000" > <div class="flow-topic-titlebar"> <div class="flow-topic-titlebar-container"> <h2 class="flow-topic-title flow-load-interactive " data-flow-topic-title="What is this page&#039;s scope?" data-flow-load-handler="topicTitle" > What is this page's scope?</h2> <div class="flow-topic-meta"> 8 comments • <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=history" class="flow-timestamp-anchor"> <span datetime="1643996381" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">17:39, 4 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </div> <span class="flow-reply-count"><span class="flow-reply-count-number">8</span></span> </div> <div class="flow-topic-summary-container " > <div class="flow-error-container"> </div> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show topic action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=history"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-clock"><span>History</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/wiki/Topic:Wovr2kqb7qwhztwu"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet flow-ui-summarize-topic-link" href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=edit-topic-summary"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-listBullet"><span>Summarize</span></span></a></li></section> <section></section> </ul> </div> </div> <!-- eachPost topic --> <div id="flow-post-wovr2kq9nqewvr5a" class="flow-post" data-flow-id="wovr2kq9nqewvr5a" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Dinoguy1000" class="mw-userlink"> <bdi>Dinoguy1000</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Dinoguy1000" class="" title="User talk:Dinoguy1000">talk</a></span><span><a href="/wiki/Special:Contributions/Dinoguy1000" title="Contributions/Dinoguy1000">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,723,0,0]}">From the name and (extremely minimal) lede, it sounds like this page is making recommendations for <i data-parsoid="{"dsr":[99,106,2,2]}">all</i> extensions. However, from the very first recommendation, it's clear that the intended scope is only extensions that are meant to be used generally, and especially those aiming for WMF deployment. This disconnect could lead readers to believe that an extension being developed exclusively for use on e.g. a single third-party wiki is either explicitly discouraged, or has to jump through unexpected hoops that implicitly discourage development of such extensions. I'm sure that such extensions shouldn't be <i data-parsoid="{"dsr":[613,627,2,2]}">encouraged</i>, but I think it's a mistake to actually discourage their creation/use, explicitly or otherwise.</p> <p data-parsoid="{"dsr":[725,997,0,0]}">tl;dr This page's lede should be expanded to clarify what sorts of extensions it's intended for: <i data-parsoid="{"dsr":[822,829,2,2]}">all</i> extensions, or only those intended for use outside of their originating communities/wikis. (Possibly individual recommendations should receive similar clarifications.)</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=reply&topic_postId=wovr2kq9nqewvr5a#flow-post-wovr2kq9nqewvr5a" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=history" class="flow-timestamp-anchor"> <span datetime="1643266922" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">07:02, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&topic_showPostId=wovr2kq9nqewvr5a#flow-post-wovr2kq9nqewvr5a"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wovsb0lv4cczkjla" class="flow-post" data-flow-id="wovsb0lv4cczkjla" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Legoktm" class="mw-userlink"> <bdi>Legoktm</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Legoktm" class="" title="User talk:Legoktm">talk</a></span><span><a href="/wiki/Special:Contributions/Legoktm" title="Contributions/Legoktm">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,309,0,0]}">The document is intended for all extensions, but I think it is worth recognizing that while something is universally a best practice, it may not be applicable for specific extensions. For example, disabling the parser cache is not a good thing, but some extensions do it, and that's okay for how they're used.</p> <p data-parsoid="{"dsr":[311,652,0,0]}">The first recommendation is "Use the standard <a href="/wiki/Bug_management" title="Bug management" rel="mw:WikiLink" data-parsoid="{"stx":"piped","a":{"href":"./Bug_management"},"sa":{"href":"Bug management"},"dsr":[357,389,17,2]}">issue tracker</a>". I don't understand why you think that's specific to WMF deployment. In general, having MediaWiki extensions track bugs in Phabricator and use Gerrit (eventually GitLab) for code review should be considered a best practice, given all the benefits from doing so.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=reply&topic_postId=wovsb0lv4cczkjla#flow-post-wovsb0lv4cczkjla" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=history" class="flow-timestamp-anchor"> <span datetime="1643268252" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">07:24, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&topic_showPostId=wovsb0lv4cczkjla#flow-post-wovsb0lv4cczkjla"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wovwygetm6d1xeqt" class="flow-post" data-flow-id="wovwygetm6d1xeqt" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Izno" class="mw-userlink"> <bdi>Izno</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Izno" class="" title="User talk:Izno">talk</a></span><span><a href="/wiki/Special:Contributions/Izno" title="Contributions/Izno">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,604,0,0]}">Not all MediaWiki wikis are owned/operated by/as public, FLOSS, and/or not-for-profit. Accordingly, all MUSTs are at best OPTIONALs for basically obvious reasons n.b. it's not reasonable to expect a private company with likely different expectations of licensing (the polar opposite of those three values, so the other end of the spectrum) to comply with "publish on WMF Gerrit" and "use WMF Phabricator" and "use PSR-4" and "localize" and etc. For example, even two other organizations that are reasonably 'open' and in a topical sphere to WMF (Miraheze, Fandom) don't do every one of those MUST things.</p> <p data-parsoid="{"dsr":[606,798,0,0]}">So, I agree that the scope should be clear, as should be the expectations associated with <em about="#mwt1" typeof="mw:Transclusion" data-parsoid="{"stx":"html","dsr":[696,706,null,null],"pi":[[{"k":"1"}]]}" data-mw="{"parts":[{"template":{"target":{"wt":"em","href":"./Template:Em"},"params":{"1":{"wt":"not"}},"i":0}}]}">not</em> developing with the requirements, objectives, and best practice as documented here in mind.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=reply&topic_postId=wovwygetm6d1xeqt#flow-post-wovwygetm6d1xeqt" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <span> Edited </span> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=compare-post-revisions&topic_newRevision=wovx1zx5l41y8roq" class="flow-timestamp-anchor"> <span datetime="1643273369" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">08:49, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&topic_showPostId=wovwygetm6d1xeqt#flow-post-wovwygetm6d1xeqt"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> <!-- eachPost nested replies --> <div id="flow-post-wpdnhzjvkqs13tew" class="flow-post" data-flow-id="wpdnhzjvkqs13tew" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Legoktm" class="mw-userlink"> <bdi>Legoktm</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Legoktm" class="" title="User talk:Legoktm">talk</a></span><span><a href="/wiki/Special:Contributions/Legoktm" title="Contributions/Legoktm">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,326,0,0]}">This document isn't targeted towards private companies who want to make their own extensions. I think it is reasonable to have a baseline for *best practices* to use localization (one of MediaWiki's <a href="/wiki/Principles" title="Principles" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./Principles"},"sa":{"href":"Principles"},"dsr":[200,214,2,2]}">Principles</a>), PSR-4 (a PHP best practice), and use Gerrit/Phabricator to be along with the rest of the MediaWiki ecosystem.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=reply&topic_postId=wpdnhzjvkqs13tew#flow-post-wpdnhzjvkqs13tew" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=history" class="flow-timestamp-anchor"> <span datetime="1643961218" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">07:53, 4 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&topic_showPostId=wpdnhzjvkqs13tew#flow-post-wpdnhzjvkqs13tew"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost nested replies --> <div id="flow-post-wpek4xn1zz31dbj7" class="flow-post" data-flow-id="wpek4xn1zz31dbj7" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Izno" class="mw-userlink"> <bdi>Izno</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Izno" class="" title="User talk:Izno">talk</a></span><span><a href="/wiki/Special:Contributions/Izno" title="Contributions/Izno">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,369,0,0]}">I don't think it's targeted at them, but it can trivially be read as if it were. Separately, because it leans on the RFC text as it does (I am increasingly not a fan in the way it changes the meaning of those words from the RFC), someone who does look at any given line with or without context will surely not see the forest from the trees when "MUST" is the word used.</p> <p data-parsoid="{"dsr":[371,816,0,0]}">This document should cater to professional engineers because the advice it gives is valuable for anyone developing an extension, not just the open source or trivially-reached MediaWiki ecosystems. That's besides the already-provided organizations which <em about="#mwt1" typeof="mw:Transclusion" data-parsoid="{"stx":"html","dsr":[624,634,null,null],"pi":[[{"k":"1"}]]}" data-mw="{"parts":[{"template":{"target":{"wt":"Em","href":"./Template:Em"},"params":{"1":{"wt":"are"}},"i":0}}]}">are</em> trivially-reached MediaWiki ecosystems and which themselves have an interest in observing these practices, yet clearly will not and do not have an interest in e.g. using WMF Gerrit.</p> <p data-parsoid="{"dsr":[818,964,0,0]}">GOLD/SILVER/BRONZE, or BEST/BETTER/CONSIDER/RECOMMENDED, or similar other words would be better on that point. Remember, these are best practices.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=reply&topic_postId=wovwygetm6d1xeqt#flow-post-wovwygetm6d1xeqt" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=history" class="flow-timestamp-anchor"> <span datetime="1643996381" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">17:39, 4 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&topic_showPostId=wpek4xn1zz31dbj7#flow-post-wpek4xn1zz31dbj7"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> </div> </div> <!-- eachPost topic --> <div id="flow-post-wovzkhex07e59vbi" class="flow-post" data-flow-id="wovzkhex07e59vbi" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Tgr_(WMF)" class="mw-userlink"> <bdi>Tgr (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Tgr_(WMF)" class="" title="User talk:Tgr (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Tgr_(WMF)" title="Contributions/Tgr (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,459,0,0]}">+1 to MUST/SHOULD/OPTIONAL vocabulary not really being useful for general guidelines. You MUST use Phabricator and Gerrit and MUST put your classes in an <code data-parsoid="{"stx":"html","dsr":[154,170,6,7]}">src</code> directory... or else what? Plenty of MediaWiki extension do not follow these rules; plenty of Wikimedia extensions do not follow many of the MUST rules, even. And I struggle to see what moral or legal authority anyone would have to make such declarations for plugins for a FLOSS software.</p> <p data-parsoid="{"dsr":[461,976,0,0]}">There are a few security-related points that we'd probably enforce by dissociating problematic extensions from the project or warning users against them, but everything else is a recommendation. Maybe rename it as good / great / best or something like that? (The <a href="/wiki/API:Client_code/Gold_standard" title="API:Client code/Gold standard" rel="mw:WikiLink" data-parsoid="{"stx":"piped","a":{"href":"./API:Client_code/Gold_standard"},"sa":{"href":"API:Client code/Gold standard"},"dsr":[724,776,32,2]}">API best practices</a> guideline uses gold/platinum, it doesn't have a third level though.) Or preserve MUST for the few things where, if we had an extension store, we would kick an extension out of it if it violated that.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=reply&topic_postId=wovzkhex07e59vbi#flow-post-wovzkhex07e59vbi" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=history" class="flow-timestamp-anchor"> <span datetime="1643276077" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">09:34, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&topic_showPostId=wovzkhex07e59vbi#flow-post-wovzkhex07e59vbi"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> <!-- eachPost nested replies --> <div id="flow-post-wox8bnjv7h1yo5s7" class="flow-post" data-flow-id="wox8bnjv7h1yo5s7" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Jdforrester_(WMF)" class="mw-userlink"> <bdi>Jdforrester (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Jdforrester_(WMF)" class="" title="User talk:Jdforrester (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Jdforrester_(WMF)" title="Contributions/Jdforrester (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><blockquote data-parsoid="{"stx":"html","dsr":[0,223,12,13]}"><p data-parsoid="{"dsr":[12,210,0,0]}">+1 to MUST/SHOULD/OPTIONAL vocabulary not really being useful for general guidelines. You MUST use Phabricator and Gerrit and MUST put your classes in an <code data-parsoid="{"stx":"html","dsr":[166,182,6,7]}">src</code> directory... or else what? </p></blockquote><p data-parsoid="{"dsr":[223,385,0,0]}">… or else you are not compliant with this document, and we would not call your extension "best practice", as judged by the standards of the MediaWiki ecosystem.</p><blockquote data-parsoid="{"stx":"html","dsr":[385,671,12,13]}"><p data-parsoid="{"dsr":[397,658,0,0]}">Plenty of MediaWiki extension do not follow these rules; plenty of Wikimedia extensions do not follow many of the MUST rules, even. And I struggle to see what moral or legal authority anyone would have to make such declarations for plugins for a FLOSS software.</p></blockquote><p data-parsoid="{"dsr":[671,740,0,0]}">Indeed. Why do you think this page is claiming it has such authority?</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=reply&topic_postId=wovzkhex07e59vbi#flow-post-wovzkhex07e59vbi" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=history" class="flow-timestamp-anchor"> <span datetime="1643324295" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">22:58, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&topic_showPostId=wox8bnjv7h1yo5s7#flow-post-wox8bnjv7h1yo5s7"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> </div> </div> <!-- eachPost topic --> <div id="flow-post-wows6m2id6uya1tb" class="flow-post" data-flow-id="wows6m2id6uya1tb" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Izno" class="mw-userlink"> <bdi>Izno</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Izno" class="" title="User talk:Izno">talk</a></span><span><a href="/wiki/Special:Contributions/Izno" title="Contributions/Izno">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,144,0,0]}">I specifically didn't speak to the RFC language since <a href="/wiki/Topic:Ugpw2635x8nzzp3z" title="Topic:Ugpw2635x8nzzp3z" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./Topic:Ugpw2635x8nzzp3z"},"sa":{"href":"Topic:Ugpw2635x8nzzp3z"},"dsr":[54,80,2,2]}">Topic:Ugpw2635x8nzzp3z</a> (second discussion from the bottom) is pertinent on that point.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=reply&topic_postId=wovr2kqb7qwhztwu#flow-post-wovr2kqb7qwhztwu" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <span> Edited </span> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=compare-post-revisions&topic_newRevision=wows9yczwhrszn2b" class="flow-timestamp-anchor"> <span datetime="1643307006" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">18:10, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&topic_showPostId=wows6m2id6uya1tb#flow-post-wows6m2id6uya1tb"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="replace" data-target="~ a" > <form class="flow-post flow-reply-form" method="POST" action="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=reply&topic_postId=wovr2kqb7qwhztwu#flow-post-wovr2kqb7qwhztwu-form-content" id="flow-reply-wovr2kqb7qwhztwu" > <input type="hidden" name="wpEditToken" value="+\" /> <input type="hidden" name="topic_replyTo" value="wovr2kqb7qwhztwu" /> <div class="flow-error-container"> </div> <div class="flow-anon-warning"> <div class="flow-anon-warning-mobile"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-down flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <div class="flow-anon-warning-desktop"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-left flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> </flowprogressivescript></div> <div class="flow-editor"> <textarea id="flow-post-wovr2kqb7qwhztwu-form-content" name="topic_content" required class="mw-ui-input flow-click-interactive mw-editfont-monospace" type="text" placeholder="Reply to "What is this page's scope?"" data-role="content" ></textarea> </div> <div class="flow-form-actions flow-form-collapsible"> <button data-role="submit" class="mw-ui-button mw-ui-progressive" >Reply</button> <small class="flow-terms-of-use plainlinks">By clicking "Reply", you agree to our <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and agree to irrevocably release your text under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0 License</a> and <a class="external text" href="https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License">GFDL</a>.</small> </div> </form> </script> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wovr2kqb7qwhztwu&action=reply&topic_postId=wovr2kqb7qwhztwu#flow-post-wovr2kqb7qwhztwu-form-content" title="Reply" class="flow-ui-input-replacement-anchor mw-ui-input" >Reply to "What is this page's scope?"</a> </div> <div class="flow-topic flow-load-interactive" id="flow-topic-wp7kzldzuigdbsbg" data-flow-id="wp7kzldzuigdbsbg" data-flow-load-handler="topic" data-flow-toc-scroll-target=".flow-topic-titlebar" data-flow-topic-timestamp-updated="1643988184000" > <div class="flow-topic-titlebar"> <div class="flow-topic-titlebar-container"> <h2 class="flow-topic-title flow-load-interactive " data-flow-topic-title="OOUI" data-flow-load-handler="topicTitle" > OOUI</h2> <div class="flow-topic-meta"> 5 comments • <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=history" class="flow-timestamp-anchor"> <span datetime="1643988184" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">15:23, 4 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </div> <span class="flow-reply-count"><span class="flow-reply-count-number">5</span></span> </div> <div class="flow-topic-summary-container " > <div class="flow-error-container"> </div> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show topic action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=history"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-clock"><span>History</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/wiki/Topic:Wp7kzldzuigdbsbg"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet flow-ui-summarize-topic-link" href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=edit-topic-summary"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-listBullet"><span>Summarize</span></span></a></li></section> <section></section> </ul> </div> </div> <!-- eachPost topic --> <div id="flow-post-wp7kzldzumefjw9o" class="flow-post" data-flow-id="wp7kzldzumefjw9o" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Yaron_Koren" class="mw-userlink"> <bdi>Yaron Koren</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Yaron_Koren" class="" title="User talk:Yaron Koren">talk</a></span><span><a href="/wiki/Special:Contributions/Yaron_Koren" title="Contributions/Yaron Koren">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,155,0,0]}">Should there be something here about using <a href="/wiki/OOUI" title="OOUI" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./OOUI"},"sa":{"href":"OOUI"},"dsr":[43,51,2,2]}">OOUI</a> when possible to create interface elements, instead of using the Html class or (*gasp*) hardcoded HTML?</p> <p data-parsoid="{"dsr":[157,298,0,0]}">By the way, the document does seem to say that the Html class should be used instead of hardcoded HTML, but maybe that part could be clearer.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=reply&topic_postId=wp7kzldzumefjw9o#flow-post-wp7kzldzumefjw9o" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <span> Edited </span> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=compare-post-revisions&topic_newRevision=wp7ltp7q9l2phdwq" class="flow-timestamp-anchor"> <span datetime="1643726699" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">14:44, 1 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&topic_showPostId=wp7kzldzumefjw9o#flow-post-wp7kzldzumefjw9o"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wp84f6t8k9eizygi" class="flow-post" data-flow-id="wp84f6t8k9eizygi" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Jdforrester_(WMF)" class="mw-userlink"> <bdi>Jdforrester (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Jdforrester_(WMF)" class="" title="User talk:Jdforrester (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Jdforrester_(WMF)" title="Contributions/Jdforrester (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,197,0,0]}">Given that OOUI is now deprecated, I think we should avoid giving that guidance right now. But sadly the alternative (Codex) isn't ready and a server-side-rendering system certainly isn't. Ah well.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=reply&topic_postId=wp84f6t8k9eizygi#flow-post-wp84f6t8k9eizygi" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=history" class="flow-timestamp-anchor"> <span datetime="1643746735" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">20:18, 1 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&topic_showPostId=wp84f6t8k9eizygi#flow-post-wp84f6t8k9eizygi"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wp8ovftzfnrjyo0s" class="flow-post" data-flow-id="wp8ovftzfnrjyo0s" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Yaron_Koren" class="mw-userlink"> <bdi>Yaron Koren</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Yaron_Koren" class="" title="User talk:Yaron Koren">talk</a></span><span><a href="/wiki/Special:Contributions/Yaron_Koren" title="Contributions/Yaron Koren">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,254,0,0]}">I didn't know OOUI was actually deprecated. Not to get into in a side issue, but is it really officially deprecated, or is it just sort of implicit that, given that a competing library is being developed, OOUI is not going to get much attention any more?</p> <p data-parsoid="{"dsr":[256,829,0,0]}">In any case, this doesn't seem like a satisfactory answer. If an extension's interface is going to adhere to the <a rel="mw:ExtLink" href="https://design.wikimedia.org/style-guide/" class="external text" data-parsoid="{"dsr":[369,441,43,1]}">Wikimedia Design Style Guide</a> (which is also not mentioned in this document, by the way), OOUI is still the easiest way to achieve that, as far as I know. Let me ask this: if a new extension were created today for use on Wikipedia or other Wikimedia sites, and it contained form elements, how would its UI be coded so that it matched the style guide? Or would it simply have the default HTML gray buttons? (Doubtful.)</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=reply&topic_postId=wp8ovftzfnrjyo0s#flow-post-wp8ovftzfnrjyo0s" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=history" class="flow-timestamp-anchor"> <span datetime="1643768769" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">02:26, 2 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&topic_showPostId=wp8ovftzfnrjyo0s#flow-post-wp8ovftzfnrjyo0s"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wpdnr8rcnnv50lid" class="flow-post" data-flow-id="wpdnr8rcnnv50lid" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Legoktm" class="mw-userlink"> <bdi>Legoktm</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Legoktm" class="" title="User talk:Legoktm">talk</a></span><span><a href="/wiki/Special:Contributions/Legoktm" title="Contributions/Legoktm">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,144,0,0]}">Re: OOUI's deprecation, see <a rel="mw:WikiLink/Interwiki" href="https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/message/SOZREBYR36PUNFZXMIUBVAIOQI4N7PDU" title="listarchive:list/wikitech-l@lists.wikimedia.org/message/SOZREBYR36PUNFZXMIUBVAIOQI4N7PDU" class="extiw" data-parsoid="{"stx":"piped","a":{"href":"https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/message/SOZREBYR36PUNFZXMIUBVAIOQI4N7PDU"},"sa":{"href":"listarchive:list/wikitech-l@lists.wikimedia.org/message/SOZREBYR36PUNFZXMIUBVAIOQI4N7PDU"},"isIW":true,"dsr":[28,143,91,2]}">this wikitech-l thread</a>.</p> <p data-parsoid="{"dsr":[146,450,0,0]}">My understanding is that practically a new MediaWiki extension would most likely use OOUI because it has the most comprehensive widget library and is well integrated into everything...Codex isn't there yet AIUI. I think leaving that as a TODO or even a note on the page saying it's in flux would be okay.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=reply&topic_postId=wpdnr8rcnnv50lid#flow-post-wpdnr8rcnnv50lid" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=history" class="flow-timestamp-anchor"> <span datetime="1643961495" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">07:58, 4 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&topic_showPostId=wpdnr8rcnnv50lid#flow-post-wpdnr8rcnnv50lid"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wpecj1cjbkjy44qx" class="flow-post" data-flow-id="wpecj1cjbkjy44qx" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Jdforrester_(WMF)" class="mw-userlink"> <bdi>Jdforrester (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Jdforrester_(WMF)" class="" title="User talk:Jdforrester (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Jdforrester_(WMF)" title="Contributions/Jdforrester (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,215,0,0]}">Codex is currently technically vapourware (there's not even an alpha release), but I have faith that it'll be usable for JS-only interfaces in the next few months (disclaimer: my team are one of those trialling it).</p> <p data-parsoid="{"dsr":[217,363,0,0]}">Codex-with-SSR (which could be used for non-JS users and to avoid FOUC) is ultra-vapourware with no plan let alone code written. It'll be a while.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=reply&topic_postId=wp7kzldzuigdbsbg#flow-post-wp7kzldzuigdbsbg" title="Reply" class="mw-ui-anchor mw-ui-progressive mw-ui-quiet flow-reply-link" >Reply</a> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=history" class="flow-timestamp-anchor"> <span datetime="1643988184" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">15:23, 4 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&topic_showPostId=wpecj1cjbkjy44qx#flow-post-wpecj1cjbkjy44qx"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="replace" data-target="~ a" > <form class="flow-post flow-reply-form" method="POST" action="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=reply&topic_postId=wp7kzldzuigdbsbg#flow-post-wp7kzldzuigdbsbg-form-content" id="flow-reply-wp7kzldzuigdbsbg" > <input type="hidden" name="wpEditToken" value="+\" /> <input type="hidden" name="topic_replyTo" value="wp7kzldzuigdbsbg" /> <div class="flow-error-container"> </div> <div class="flow-anon-warning"> <div class="flow-anon-warning-mobile"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-down flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <div class="flow-anon-warning-desktop"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-left flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> </flowprogressivescript></div> <div class="flow-editor"> <textarea id="flow-post-wp7kzldzuigdbsbg-form-content" name="topic_content" required class="mw-ui-input flow-click-interactive mw-editfont-monospace" type="text" placeholder="Reply to "OOUI"" data-role="content" ></textarea> </div> <div class="flow-form-actions flow-form-collapsible"> <button data-role="submit" class="mw-ui-button mw-ui-progressive" >Reply</button> <small class="flow-terms-of-use plainlinks">By clicking "Reply", you agree to our <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and agree to irrevocably release your text under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0 License</a> and <a class="external text" href="https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License">GFDL</a>.</small> </div> </form> </script> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7kzldzuigdbsbg&action=reply&topic_postId=wp7kzldzuigdbsbg#flow-post-wp7kzldzuigdbsbg-form-content" title="Reply" class="flow-ui-input-replacement-anchor mw-ui-input" >Reply to "OOUI"</a> </div> <div class="flow-topic flow-load-interactive flow-topic-moderatestate-lock flow-topic-moderated flow-element-collapsible flow-element-collapsed" id="flow-topic-wp7lbx9iay3b93my" data-flow-id="wp7lbx9iay3b93my" data-flow-load-handler="topic" data-flow-toc-scroll-target=".flow-topic-titlebar" data-flow-topic-timestamp-updated="1643823215000" > <div class="flow-topic-titlebar"> <div class="flow-topic-titlebar-container"> <h2 class="flow-topic-title flow-load-interactive flow-collapse-toggle flow-click-interactive" data-flow-topic-title="&quot;Regularly submit and receive translations from translatewiki.net&quot;" data-flow-load-handler="topicTitle" data-flow-interactive-handler="collapserCollapsibleToggle" > <span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-check"></span> "Regularly submit and receive translations from translatewiki.net"</h2> <div class="flow-topic-meta"> <a class="expand-collapse-posts-link flow-collapse-toggle flow-click-interactive" href="javascript:void(0);" title="View comments" data-collapsed-title="View comments" data-expanded-title="Hide comments" data-flow-interactive-handler="collapserCollapsibleToggle" >3 comments</a> • <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my&action=history" class="flow-timestamp-anchor"> <span datetime="1643823215" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">17:33, 2 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </div> <span class="flow-reply-count"><span class="flow-reply-count-number">3</span></span> </div> <div class="flow-topic-summary-container flow-collapse-toggle flow-click-interactive" data-flow-interactive-handler="collapserCollapsibleToggle" > <div class="flow-error-container"> </div> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show topic action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my&action=history"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-clock"><span>History</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/wiki/Topic:Wp7lbx9iay3b93my"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <!-- eachPost topic --> <div id="flow-post-wp7lbx9ib21dh7l6" class="flow-post" data-flow-id="wp7lbx9ib21dh7l6" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Yaron_Koren" class="mw-userlink"> <bdi>Yaron Koren</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Yaron_Koren" class="" title="User talk:Yaron Koren">talk</a></span><span><a href="/wiki/Special:Contributions/Yaron_Koren" title="Contributions/Yaron Koren">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,186,0,0]}">It's a good idea for extensions to regularly receive translations from translatewiki.net (not that we really have a choice in the matter), but what does it mean to regularly submit them?</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my&action=history" class="flow-timestamp-anchor"> <span datetime="1643726167" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">14:36, 1 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my&topic_showPostId=wp7lbx9ib21dh7l6#flow-post-wp7lbx9ib21dh7l6"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wp7vdv8gk2lvr17k" class="flow-post" data-flow-id="wp7vdv8gk2lvr17k" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Krinkle" class="mw-userlink"> <bdi>Krinkle</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Krinkle" class="" title="User talk:Krinkle">talk</a></span><span><a href="/wiki/Special:Contributions/Krinkle" title="Contributions/Krinkle">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,128,0,0]}">I've <a rel="mw:ExtLink" href="https://www.mediawiki.org/w/index.php?title=Best_practices_for_extensions&type=revision&diff=5050938&oldid=5050695" class="external text" data-parsoid="{"dsr":[5,127,116,1]}">added</a>:</p> <blockquote data-parsoid="{"stx":"html","dsr":[130,510,12,13]}"><p data-parsoid="{"dsr":[142,497,0,0]}">For extensions hosted in Wikimedia Gerrit, translatewiki.net staff will generally proactively do this for you. They start an automatic process which subscribes to new messages from your extension, and also automatically exports and merges updated translations back into your repository once a day. If this hasn't happened within a week, contact TWN staff.</p></blockquote><p data-parsoid="{"dsr":[510,631,0,0]}">I copied and summarised this from the <a href="/wiki/Translatewiki.net" title="Translatewiki.net" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./Translatewiki.net"},"sa":{"href":"translatewiki.net"},"dsr":[548,569,2,2]}">translatewiki.net</a> page, which was previously linked from the same bullet point.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my&action=history" class="flow-timestamp-anchor"> <span datetime="1643736999" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">17:36, 1 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my&topic_showPostId=wp7vdv8gk2lvr17k#flow-post-wp7vdv8gk2lvr17k"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wpa1atwjzbg08hk2" class="flow-post" data-flow-id="wpa1atwjzbg08hk2" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Yaron_Koren" class="mw-userlink"> <bdi>Yaron Koren</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Yaron_Koren" class="" title="User talk:Yaron Koren">talk</a></span><span><a href="/wiki/Special:Contributions/Yaron_Koren" title="Contributions/Yaron Koren">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,30,0,0]}">Thanks, that looks good to me.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my&action=history" class="flow-timestamp-anchor"> <span datetime="1643820944" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">16:55, 2 February 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Wp7lbx9iay3b93my&topic_showPostId=wpa1atwjzbg08hk2#flow-post-wpa1atwjzbg08hk2"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <form class="flow-post flow-reply-form" method="POST" action="" id="flow-reply-wp7lbx9iay3b93my" > <input type="hidden" name="wpEditToken" value="+\" /> <input type="hidden" name="topic_replyTo" value="wp7lbx9iay3b93my" /> <div class="flow-error-container"> </div> <div class="flow-anon-warning"> <div class="flow-anon-warning-mobile"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-down flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <div class="flow-anon-warning-desktop"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-left flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> </flowprogressivescript></div> <div class="flow-editor"> <textarea id="flow-post-wp7lbx9iay3b93my-form-content" name="topic_content" required class="mw-ui-input flow-click-interactive mw-editfont-monospace" type="text" placeholder="Reply to ""Regularly submit and receive translations from translatewiki.net""" data-role="content" ></textarea> </div> <div class="flow-form-actions flow-form-collapsible"> <button data-role="submit" class="mw-ui-button mw-ui-progressive" >Reply</button> <small class="flow-terms-of-use plainlinks">By clicking "Reply", you agree to our <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and agree to irrevocably release your text under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0 License</a> and <a class="external text" href="https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License">GFDL</a>.</small> </div> </form> </script></div> <div class="flow-topic flow-load-interactive flow-topic-moderatestate-lock flow-topic-moderated flow-element-collapsible flow-element-collapsed" id="flow-topic-uwqk40oa4gei3h9m" data-flow-id="uwqk40oa4gei3h9m" data-flow-load-handler="topic" data-flow-toc-scroll-target=".flow-topic-titlebar" data-flow-topic-timestamp-updated="1643251842000" > <div class="flow-topic-titlebar"> <div class="flow-topic-titlebar-container"> <h2 class="flow-topic-title flow-load-interactive flow-collapse-toggle flow-click-interactive" data-flow-topic-title="Don&#039;t: directly construct service objects" data-flow-load-handler="topicTitle" data-flow-interactive-handler="collapserCollapsibleToggle" > <span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-check"></span> Don't: directly construct service objects</h2> <div class="flow-topic-meta"> <a class="expand-collapse-posts-link flow-collapse-toggle flow-click-interactive" href="javascript:void(0);" title="View comments" data-collapsed-title="View comments" data-expanded-title="Hide comments" data-flow-interactive-handler="collapserCollapsibleToggle" >14 comments</a> • <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1643251842" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">02:50, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </div> <span class="flow-reply-count"><span class="flow-reply-count-number">14</span></span> </div> <div class="flow-topic-summary-container flow-collapse-toggle flow-click-interactive" data-flow-interactive-handler="collapserCollapsibleToggle" > <div class="flow-error-container"> </div> <div class="flow-topic-summary"> <div class="flow-topic-summary-author"> Summary by Krinkle </div> <div class="flow-topic-summary-content mw-parser-output"> <section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,32,0,0]}">See <a href="/wiki/Stable_interface_policy" title="Stable interface policy" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./Stable_interface_policy"},"sa":{"href":"Stable interface policy"},"dsr":[4,31,2,2]}">Stable interface policy</a>.</p></section> </div> <div style="clear: both;"></div> </div> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show topic action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-clock"><span>History</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/wiki/Topic:Uwqk40oa4gei3h9m"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <!-- eachPost topic --> <div id="flow-post-uwqk40oa4kckbl7u" class="flow-post" data-flow-id="uwqk40oa4kckbl7u" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:DKinzler_(WMF)" class="mw-userlink"> <bdi>DKinzler (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:DKinzler_(WMF)" class="" title="User talk:DKinzler (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/DKinzler_(WMF)" title="Contributions/DKinzler (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,469,0,0]}">In a way similar to protected methods, constructor signatures of service-like objects are generally not stable. They are intended for use by wiring code, and can be expected to change without notice. Extensions (and all application logic) should ideally only ever directly construct plain value objects. However, we still have quite a number of things in core that are neither service objects nor value objects. So I propose to add the following to the "Don't" section:</p> <ul data-parsoid="{"dsr":[471,672,0,0]}"><li data-parsoid="{"dsr":[471,594,1,0]}">MUST NOT: directly instantiate a service class defined by core, instead of obtaining an instance via a service container.</li> <li data-parsoid="{"dsr":[595,672,1,0]}">SHOULD NOT: directly instantiate anything that is not a plain value object.</li></ul></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1553703024" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">16:10, 27 March 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uwqk40oa4kckbl7u#flow-post-uwqk40oa4kckbl7u"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uwqty1k00dlhihhx" class="flow-post" data-flow-id="uwqty1k00dlhihhx" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Jdforrester_(WMF)" class="mw-userlink"> <bdi>Jdforrester (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Jdforrester_(WMF)" class="" title="User talk:Jdforrester (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Jdforrester_(WMF)" title="Contributions/Jdforrester (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,12,0,0]}">Sounds good.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1553713619" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">19:06, 27 March 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uwqty1k00dlhihhx#flow-post-uwqty1k00dlhihhx"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxojldfki2bzs7je" class="flow-post" data-flow-id="uxojldfki2bzs7je" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Tgr_(WMF)" class="mw-userlink"> <bdi>Tgr (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Tgr_(WMF)" class="" title="User talk:Tgr (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Tgr_(WMF)" title="Contributions/Tgr (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,205,0,0]}">Sometimes you need a service with non-default configuration, most commonly when doing cross-wiki things. (Random recent example: <a rel="mw:ExtLink" href="https://gerrit.wikimedia.org/r/c/mediawiki/extensions/JsonConfig/+/503004" class="external autonumber" data-parsoid="{"targetOff":203,"contentOffsets":[203,203],"dsr":[129,204,74,1]}"></a>)</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1555021183" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">22:19, 11 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uxojldfki2bzs7je#flow-post-uxojldfki2bzs7je"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxpkm4vvzcmjtt7u" class="flow-post" data-flow-id="uxpkm4vvzcmjtt7u" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:DKinzler_(WMF)" class="mw-userlink"> <bdi>DKinzler (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:DKinzler_(WMF)" class="" title="User talk:DKinzler (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/DKinzler_(WMF)" title="Contributions/DKinzler (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,84,0,0]}">As long as that is in core, it could be acceptable. Extensions should never do that.</p> <p data-parsoid="{"dsr":[86,199,0,0]}">The Right Way (tm) is to introduce a factory service that you can ask for a service instance for the target wiki.</p> <p data-parsoid="{"dsr":[201,344,0,0]}">Eventually (tm) we'd want a full MediaWikiServices instance for the target wiki. That will be possible as soon as no service uses global state.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1555061069" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">09:24, 12 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uxpkm4vvzcmjtt7u#flow-post-uxpkm4vvzcmjtt7u"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxq4yfynm8k6wns5" class="flow-post" data-flow-id="uxq4yfynm8k6wns5" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Tgr_(WMF)" class="mw-userlink"> <bdi>Tgr (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Tgr_(WMF)" class="" title="User talk:Tgr (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Tgr_(WMF)" title="Contributions/Tgr (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,515,0,0]}">We won't realistically introduce factories for all the services which depend on the wiki (which is basically all the services), MediaWikiServices doesn't support using foreign wiki configuration yet (even if it will, that will only cover wikis in the same farm, which is not the only use case), and expecting extension authors to make core changes instead of doing simple workarounds in their extensions is not realistic or reasonable IMO (especially as long as we don't get our code review problems under control).</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1555082985" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">15:29, 12 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uxq4yfynm8k6wns5#flow-post-uxq4yfynm8k6wns5"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxyqjbaso24al6xh" class="flow-post" data-flow-id="uxyqjbaso24al6xh" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:DKinzler_(WMF)" class="mw-userlink"> <bdi>DKinzler (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:DKinzler_(WMF)" class="" title="User talk:DKinzler (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/DKinzler_(WMF)" title="Contributions/DKinzler (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,72,0,0]}">> MediaWikiServices doesn't support using foreign wiki configuration yet</p> <p data-parsoid="{"dsr":[74,156,0,0]}">Actually, it does. But not all services are completely isolated from global state.</p> <p data-parsoid="{"dsr":[158,299,0,0]}">> expecting extension authors to make core changes instead of doing simple workarounds in their extensions is not realistic or reasonable IMO</p> <p data-parsoid="{"dsr":[301,492,0,0]}">These workarounds are what is preventing core changes, because we break them when we change core. I would expect extension authors to request or propose core changes when they need them, yes.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1555416521" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">12:08, 16 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uxyqjbaso24al6xh#flow-post-uxyqjbaso24al6xh"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxytkm182whbtvim" class="flow-post" data-flow-id="uxytkm182whbtvim" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:DKinzler_(WMF)" class="mw-userlink"> <bdi>DKinzler (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:DKinzler_(WMF)" class="" title="User talk:DKinzler (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/DKinzler_(WMF)" title="Contributions/DKinzler (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,234,0,0]}">Reconsidering what I just said: extensions may have a need to call constructors of services if they extend the service class, or if the replace the service instance. That is, they may need to call service constructors in wiring code. </p> <p data-parsoid="{"dsr":[236,454,0,0]}">This is fine as long as the service is declared to be extensible - which implies that the constructor signature is treated as public and stable. Constructor signatures of other services should not be considered stable.</p> <p data-parsoid="{"dsr":[456,980,0,0]}">The rationale for this restriction is to support better dependency injection: with DI, there is often a need to change constructor signatures. Which is generally no problem since DI says that the constructor is only called in the wiring code, so there is only one place that needs to be changed to accommodate the new signature. Making such changes backwards compatible is a burden that should be avoided when possible - that is, we should only pay that cost in cases where the service is intended as an extension interface.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1555419792" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">13:03, 16 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uxytkm182whbtvim#flow-post-uxytkm182whbtvim"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxz7intr6fnf16pe" class="flow-post" data-flow-id="uxz7intr6fnf16pe" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Tgr_(WMF)" class="mw-userlink"> <bdi>Tgr (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Tgr_(WMF)" class="" title="User talk:Tgr (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Tgr_(WMF)" title="Contributions/Tgr (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,20,0,0]}">> Actually, it does.</p> <p data-parsoid="{"dsr":[22,339,0,0]}">Actually, it doesn't<span typeof="mw:DisplaySpace mw:Placeholder" data-parsoid="{"src":" ","isDisplayHack":true,"dsr":[42,43,null,0]}"> </span>:) There is no way for me to obtain a DI container for a foreign wiki, short of constructing that container myself using a fake configuration object that I also construct myself, which is a lot more nasty than constructing a specific service manually using a specific wiki ID and language object.</p> <p data-parsoid="{"dsr":[341,436,0,0]}">> I would expect extension authors to request or propose core changes when they need them, yes.</p> <p data-parsoid="{"dsr":[438,945,0,0]}">That's a reasonable expectations for WMF staff maintaining extensions used in Wikimedia production. It's a completely unreasonable expectation for people running their own wikis, possibly in their free time, their bug reports get mostly ignored and their patches spend months if not forever in Gerrit without anyone ever looking at them. The MediaWiki community just does not provide the level of volunteer support currently where we could in good conscience ask people to have their problems fixed in core.</p> <p data-parsoid="{"dsr":[947,1188,0,0]}">More specifically to the foreign wiki issue, what would the core change be? Do we really want to create a factory class for everything that takes a wiki ID, when those classes won't be necessary once MediaWikiServices supports foreign wikis?</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1555434817" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">17:13, 16 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uxz7intr6fnf16pe#flow-post-uxz7intr6fnf16pe"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxz8632iplamrjr1" class="flow-post" data-flow-id="uxz8632iplamrjr1" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:DKinzler_(WMF)" class="mw-userlink"> <bdi>DKinzler (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:DKinzler_(WMF)" class="" title="User talk:DKinzler (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/DKinzler_(WMF)" title="Contributions/DKinzler (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,148,0,0]}">> There is no way for me to obtain a DI container for a foreign wiki, short of constructing that container myself using a fake configuration object</p> <p data-parsoid="{"dsr":[150,365,0,0]}">Right - the problem is that there is no clean way to get the config settings for another wiki. For this to be complete, it would have to include the enabled extensions as well, so we'll need injecteble hook runners.</p> <p data-parsoid="{"dsr":[367,606,0,0]}">> It's a completely unreasonable expectation for people running their own wikis, possibly in their free time, their bug reports get mostly ignored and their patches spend months if not forever in Gerrit without anyone ever looking at them.</p> <p data-parsoid="{"dsr":[608,744,0,0]}">This policy doesn't apply to people writing their own extension for their own use. But yes, their extension might break without warning.</p> <p data-parsoid="{"dsr":[746,989,0,0]}">> More specifically to the foreign wiki issue, what would the core change be? Do we really want to create a factory class for everything that takes a wiki ID, when those classes won't be necessary once MediaWikiServices supports foreign wikis?</p> <p data-parsoid="{"dsr":[991,1131,0,0]}">I'm not particularly keen on doing that, but the code is trivial enough. We could have a helper class or a trait for the boiler plate, even.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <span> Edited </span> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=compare-post-revisions&topic_newRevision=uxzaoqkrjonqrd85" class="flow-timestamp-anchor"> <span datetime="1555438231" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">18:10, 16 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uxz8632iplamrjr1#flow-post-uxz8632iplamrjr1"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxze4frlnpn1ptud" class="flow-post" data-flow-id="uxze4frlnpn1ptud" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Tgr_(WMF)" class="mw-userlink"> <bdi>Tgr (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Tgr_(WMF)" class="" title="User talk:Tgr (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Tgr_(WMF)" title="Contributions/Tgr (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,293,0,0]}">This page is definitely meant for people writing their own extensions, so that they end up with maintainable code that others can reuse. Although I guess it would make sense to treat it as a policy (which it currently isn't) for Wikimedia-deployed extensions and merely as guidance for others.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1555441933" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">19:12, 16 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uxze4frlnpn1ptud#flow-post-uxze4frlnpn1ptud"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxzepcsigdj4q5xe" class="flow-post" data-flow-id="uxzepcsigdj4q5xe" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:DKinzler_(WMF)" class="mw-userlink"> <bdi>DKinzler (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:DKinzler_(WMF)" class="" title="User talk:DKinzler (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/DKinzler_(WMF)" title="Contributions/DKinzler (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,112,0,0]}">You are right, of course - it is <i data-parsoid="{"dsr":[33,42,2,2]}">meant</i> for them, but thy are not <i data-parsoid="{"dsr":[69,78,2,2]}">bound</i> by it. Sorry for being imprecise.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1555442559" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">19:22, 16 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uxzepcsigdj4q5xe#flow-post-uxzepcsigdj4q5xe"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxzi9d5nt34x61xx" class="flow-post" data-flow-id="uxzi9d5nt34x61xx" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Tgr_(WMF)" class="mw-userlink"> <bdi>Tgr (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Tgr_(WMF)" class="" title="User talk:Tgr (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Tgr_(WMF)" title="Contributions/Tgr (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,140,0,0]}">The point is, don't add MUST NOTs that are not reasonable expectations for most of the intended audience (even if they are not bound by it).</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1555446390" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">20:26, 16 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uxzi9d5nt34x61xx#flow-post-uxzi9d5nt34x61xx"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uy2zhsexslw0zgwl" class="flow-post" data-flow-id="uy2zhsexslw0zgwl" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:DKinzler_(WMF)" class="mw-userlink"> <bdi>DKinzler (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:DKinzler_(WMF)" class="" title="User talk:DKinzler (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/DKinzler_(WMF)" title="Contributions/DKinzler (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,234,0,0]}">I think they are reasonable expectations. The only way to get out of the we-can't-change-core-without-breaking-extensions dead end is to limit what extensions can do (or what they can expect to continue working with the next release).</p> <p data-parsoid="{"dsr":[236,342,0,0]}">But you are right about my original proposal being too restrictive. It should be more along the lines of: </p> <ul data-parsoid="{"dsr":[344,565,0,0]}"><li data-parsoid="{"dsr":[344,565,1,0]}">MUST NOT: directly instantiate a service class defined by core, instead of obtaining an instance via a service container, except when wrapping, replacing or defining a service that is documented to be an extension point.</li></ul> <p data-parsoid="{"dsr":[567,604,0,0]}">Another way of phrasing this would be</p> <ul data-parsoid="{"dsr":[606,825,0,0]}"><li data-parsoid="{"dsr":[606,825,1,0]}">MUST NOT rely on the stability of a constructor signature of a class that is not defined to be a pure value object, or documented to be an extension point suitable for subclassing or direct construction by extensions.</li></ul> <p data-parsoid="{"dsr":[827,900,0,0]}">The second option is not less restrictive, but perhaps more to the point.</p> <p data-parsoid="{"dsr":[902,908,0,0]}"><br data-parsoid="{"stx":"html","selfClose":true,"dsr":[902,908,6,0]}"/></p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1555581315" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">09:55, 18 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=uy2zhsexslw0zgwl#flow-post-uy2zhsexslw0zgwl"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wovd2hk5tlmutrmp" class="flow-post" data-flow-id="wovd2hk5tlmutrmp" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Krinkle" class="mw-userlink"> <bdi>Krinkle</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Krinkle" class="" title="User talk:Krinkle">talk</a></span><span><a href="/wiki/Special:Contributions/Krinkle" title="Contributions/Krinkle">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,61,0,0]}">I believe this is now covered by <a href="/wiki/Stable_interface_policy" title="Stable interface policy" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./Stable_interface_policy"},"sa":{"href":"Stable interface policy"},"dsr":[33,60,2,2]}">Stable interface policy</a>.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&action=history" class="flow-timestamp-anchor"> <span datetime="1643251836" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">02:50, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqk40oa4gei3h9m&topic_showPostId=wovd2hk5tlmutrmp#flow-post-wovd2hk5tlmutrmp"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <form class="flow-post flow-reply-form" method="POST" action="" id="flow-reply-uwqk40oa4gei3h9m" > <input type="hidden" name="wpEditToken" value="+\" /> <input type="hidden" name="topic_replyTo" value="uwqk40oa4gei3h9m" /> <div class="flow-error-container"> </div> <div class="flow-anon-warning"> <div class="flow-anon-warning-mobile"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-down flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <div class="flow-anon-warning-desktop"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-left flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> </flowprogressivescript></div> <div class="flow-editor"> <textarea id="flow-post-uwqk40oa4gei3h9m-form-content" name="topic_content" required class="mw-ui-input flow-click-interactive mw-editfont-monospace" type="text" placeholder="Reply to "Don't: directly construct service objects"" data-role="content" ></textarea> </div> <div class="flow-form-actions flow-form-collapsible"> <button data-role="submit" class="mw-ui-button mw-ui-progressive" >Reply</button> <small class="flow-terms-of-use plainlinks">By clicking "Reply", you agree to our <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and agree to irrevocably release your text under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0 License</a> and <a class="external text" href="https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License">GFDL</a>.</small> </div> </form> </script></div> <div class="flow-topic flow-load-interactive flow-topic-moderatestate-lock flow-topic-moderated flow-element-collapsible flow-element-collapsed" id="flow-topic-uxojqdvbtjpbbb94" data-flow-id="uxojqdvbtjpbbb94" data-flow-load-handler="topic" data-flow-toc-scroll-target=".flow-topic-titlebar" data-flow-topic-timestamp-updated="1643251775000" > <div class="flow-topic-titlebar"> <div class="flow-topic-titlebar-container"> <h2 class="flow-topic-title flow-load-interactive flow-collapse-toggle flow-click-interactive" data-flow-topic-title="Deprecate /includes" data-flow-load-handler="topicTitle" data-flow-interactive-handler="collapserCollapsibleToggle" > <span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-check"></span> Deprecate /includes</h2> <div class="flow-topic-meta"> <a class="expand-collapse-posts-link flow-collapse-toggle flow-click-interactive" href="javascript:void(0);" title="View comments" data-collapsed-title="View comments" data-expanded-title="Hide comments" data-flow-interactive-handler="collapserCollapsibleToggle" >2 comments</a> • <a href="//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94&action=history" class="flow-timestamp-anchor"> <span datetime="1643251775" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">02:49, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </div> <span class="flow-reply-count"><span class="flow-reply-count-number">2</span></span> </div> <div class="flow-topic-summary-container flow-collapse-toggle flow-click-interactive" data-flow-interactive-handler="collapserCollapsibleToggle" > <div class="flow-error-container"> </div> <div class="flow-topic-summary"> <div class="flow-topic-summary-author"> Summary by Krinkle </div> <div class="flow-topic-summary-content mw-parser-output"> <section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,51,0,0]}">Done, we now recommend PSR4 and a "/src" directory.</p></section> </div> <div style="clear: both;"></div> </div> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show topic action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94&action=history"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-clock"><span>History</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/wiki/Topic:Uxojqdvbtjpbbb94"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxojqdvbtnndjf7c" class="flow-post" data-flow-id="uxojqdvbtnndjf7c" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Tgr_(WMF)" class="mw-userlink"> <bdi>Tgr (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Tgr_(WMF)" class="" title="User talk:Tgr (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/Tgr_(WMF)" title="Contributions/Tgr (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,176,0,0]}">See comment at <a href="/wiki/Manual_talk:Coding_conventions/PHP#Directory_Structure" class="mw-redirect" title="Manual talk:Coding conventions/PHP" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./Manual_talk:Coding_conventions/PHP#Directory_Structure"},"sa":{"href":"Manual talk:Coding conventions/PHP#Directory Structure"},"dsr":[15,73,2,2]}">Manual talk:Coding conventions/PHP#Directory Structure</a>. I agree; we should follow standard PHP naming conventions and use /src for at least PSR-4 extensions.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94&action=history" class="flow-timestamp-anchor"> <span datetime="1555021333" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">22:22, 11 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94&topic_showPostId=uxojqdvbtnndjf7c#flow-post-uxojqdvbtnndjf7c"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uxopqqqq2ak2cjra" class="flow-post" data-flow-id="uxopqqqq2ak2cjra" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:BDavis_(WMF)" class="mw-userlink"> <bdi>BDavis (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:BDavis_(WMF)" class="" title="User talk:BDavis (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/BDavis_(WMF)" title="Contributions/BDavis (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,67,0,0]}">+1 for src/ in new projects. includes/ is a very PHP3/4 convention.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94&action=history" class="flow-timestamp-anchor"> <span datetime="1555027808" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">00:10, 12 April 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uxojqdvbtjpbbb94&topic_showPostId=uxopqqqq2ak2cjra#flow-post-uxopqqqq2ak2cjra"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <form class="flow-post flow-reply-form" method="POST" action="" id="flow-reply-uxojqdvbtjpbbb94" > <input type="hidden" name="wpEditToken" value="+\" /> <input type="hidden" name="topic_replyTo" value="uxojqdvbtjpbbb94" /> <div class="flow-error-container"> </div> <div class="flow-anon-warning"> <div class="flow-anon-warning-mobile"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-down flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <div class="flow-anon-warning-desktop"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-left flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> </flowprogressivescript></div> <div class="flow-editor"> <textarea id="flow-post-uxojqdvbtjpbbb94-form-content" name="topic_content" required class="mw-ui-input flow-click-interactive mw-editfont-monospace" type="text" placeholder="Reply to "Deprecate /includes"" data-role="content" ></textarea> </div> <div class="flow-form-actions flow-form-collapsible"> <button data-role="submit" class="mw-ui-button mw-ui-progressive" >Reply</button> <small class="flow-terms-of-use plainlinks">By clicking "Reply", you agree to our <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and agree to irrevocably release your text under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0 License</a> and <a class="external text" href="https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License">GFDL</a>.</small> </div> </form> </script></div> <div class="flow-topic flow-load-interactive flow-topic-moderatestate-lock flow-topic-moderated flow-element-collapsible flow-element-collapsed" id="flow-topic-uwqjvrjzh84larvx" data-flow-id="uwqjvrjzh84larvx" data-flow-load-handler="topic" data-flow-toc-scroll-target=".flow-topic-titlebar" data-flow-topic-timestamp-updated="1643251756000" > <div class="flow-topic-titlebar"> <div class="flow-topic-titlebar-container"> <h2 class="flow-topic-title flow-load-interactive flow-collapse-toggle flow-click-interactive" data-flow-topic-title="Don&#039;t: subclass anything not intended to be subclassed by extensions" data-flow-load-handler="topicTitle" data-flow-interactive-handler="collapserCollapsibleToggle" > <span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-check"></span> Don't: subclass anything not intended to be subclassed by extensions</h2> <div class="flow-topic-meta"> <a class="expand-collapse-posts-link flow-collapse-toggle flow-click-interactive" href="javascript:void(0);" title="View comments" data-collapsed-title="View comments" data-expanded-title="Hide comments" data-flow-interactive-handler="collapserCollapsibleToggle" >3 comments</a> • <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx&action=history" class="flow-timestamp-anchor"> <span datetime="1643251756" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">02:49, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </div> <span class="flow-reply-count"><span class="flow-reply-count-number">3</span></span> </div> <div class="flow-topic-summary-container flow-collapse-toggle flow-click-interactive" data-flow-interactive-handler="collapserCollapsibleToggle" > <div class="flow-error-container"> </div> <div class="flow-topic-summary"> <div class="flow-topic-summary-author"> Summary by Krinkle </div> <div class="flow-topic-summary-content mw-parser-output"> <section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,38,0,0]}">Done, per <a href="/wiki/Stable_interface_policy" title="Stable interface policy" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./Stable_interface_policy"},"sa":{"href":"Stable interface policy"},"dsr":[10,37,2,2]}">Stable interface policy</a>.</p></section> </div> <div style="clear: both;"></div> </div> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show topic action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx&action=history"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-clock"><span>History</span></span></a></li><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/wiki/Topic:Uwqjvrjzh84larvx"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <!-- eachPost topic --> <div id="flow-post-uwqjvrjzhc2nivu5" class="flow-post" data-flow-id="uwqjvrjzhc2nivu5" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:DKinzler_(WMF)" class="mw-userlink"> <bdi>DKinzler (WMF)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:DKinzler_(WMF)" class="" title="User talk:DKinzler (WMF)">talk</a></span><span><a href="/wiki/Special:Contributions/DKinzler_(WMF)" title="Contributions/DKinzler (WMF)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,54,0,0]}">I propose to add the following to the "Don't" section:</p> <ul data-parsoid="{"dsr":[56,201,0,0]}"><li data-parsoid="{"dsr":[56,201,1,0]}">MUST NOT: subclass (extend) any class defined by MediaWiki core, unless that class is explicitly documented to allow subclassing by extensions.</li></ul><p data-parsoid="{"dsr":[201,417,0,0]}"> The reason for this is that protected methods are not part of our stable interface per the <a href="/wiki/Deprecation_policy" class="mw-redirect" title="Deprecation policy" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./Deprecation_policy"},"sa":{"href":"Deprecation policy"},"dsr":[294,316,2,2]}">Deprecation policy</a>, so such subclasses may break without warning. The relevant section of the deprecation policy reads:</p><blockquote data-parsoid="{"stx":"html","dsr":[417,908,12,13]}"><p data-parsoid="{"dsr":[429,895,0,0]}">[...] the stable part of the PHP API is comprised of all code that is explicitly marked public, and has been included in at least one stable release. In addition, some classes expect to be subclassed in extensions; in those cases protected functions also are included in the API. These classes should have a note in their documentation comment that they expect subclassing. If no note is present, it SHOULD be assumed that the class is not expected to be subclassed.</p></blockquote><p data-parsoid="{"dsr":[908,1120,0,0]}">I'm tempted to even extend this to implementing interfaces. Not all interface declarations are intended as extension points, and not all of them should be considered stable. If we go that far, we should also add:</p> <ul data-parsoid="{"dsr":[1122,1271,0,0]}"><li data-parsoid="{"dsr":[1122,1271,1,0]}">MUST NOT: implement any interface declared by MediaWiki core, unless that interface is explicitly documented to allow implementation by extensions.</li></ul></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx&action=history" class="flow-timestamp-anchor"> <span datetime="1553702777" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">16:06, 27 March 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx&topic_showPostId=uwqjvrjzhc2nivu5#flow-post-uwqjvrjzhc2nivu5"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-uwqlacrn7xqtpynh" class="flow-post" data-flow-id="uwqlacrn7xqtpynh" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Thiemo_Kreuz_(WMDE)" class="mw-userlink"> <bdi>Thiemo Kreuz (WMDE)</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Thiemo_Kreuz_(WMDE)" class="" title="User talk:Thiemo Kreuz (WMDE)">talk</a></span><span><a href="/wiki/Special:Contributions/Thiemo_Kreuz_(WMDE)" title="Contributions/Thiemo Kreuz (WMDE)">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,36,0,0]}">+1 to both suggestions from my side.</p> <p data-parsoid="{"dsr":[38,458,0,0]}">I, personally, find it a really helpful rule-of-thumb to consider all classes to be <code data-parsoid="{"stx":"html","dsr":[122,140,6,7]}">final</code>, except otherwise stated. The effect of this restriction is pretty much the same as you suggest: one can not extend anything, except it is allowed. The only reason we are not literally marking all our code as <code data-parsoid="{"stx":"html","dsr":[350,368,6,7]}">final</code> is that it would be cumbersome and error-prone. But we should still threat it like it is.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx&action=history" class="flow-timestamp-anchor"> <span datetime="1553704291" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">16:31, 27 March 2019</span> <span id="" class="flow-timestamp-ago">5 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx&topic_showPostId=uwqlacrn7xqtpynh#flow-post-uwqlacrn7xqtpynh"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <!-- eachPost topic --> <div id="flow-post-wovczoik2vzlb3qb" class="flow-post" data-flow-id="wovczoik2vzlb3qb" > <div class="flow-post-main"> <div class="flow-error-container"> </div> <span class="flow-author"> <a href="/wiki/User:Krinkle" class="mw-userlink"> <bdi>Krinkle</bdi></a><span class="mw-usertoollinks flow-pipelist"> (<span><a href="/wiki/User_talk:Krinkle" class="" title="User talk:Krinkle">talk</a></span><span><a href="/wiki/Special:Contributions/Krinkle" title="Contributions/Krinkle">contribs</a></span>) </span> </span> <article class="flow-post-content mw-parser-output"><section data-mw-section-id="0" data-parsoid="{}"><p data-parsoid="{"dsr":[0,60,0,0]}">This has been superseded by the <a href="/wiki/Stable_interface_policy" title="Stable interface policy" rel="mw:WikiLink" data-parsoid="{"stx":"simple","a":{"href":"./Stable_interface_policy"},"sa":{"href":"Stable interface policy"},"dsr":[32,59,2,2]}">Stable interface policy</a>.</p></section></article> <div class="flow-post-meta"> <span class="flow-post-meta-actions"> </span> <span class="flow-post-timestamp"> <a href="//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx&action=history" class="flow-timestamp-anchor"> <span datetime="1643251752" class="flow-timestamp flow-load-interactive" data-flow-load-handler="timestamp"> <span class="flow-timestamp-user-formatted">02:49, 27 January 2022</span> <span id="" class="flow-timestamp-ago">2 years ago</span> </span> </a> </span> </div> <div class="flow-menu flow-menu-hoverable"> <div class="flow-menu-js-drop"><a href="javascript:void(0);"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-ellipsis" aria-label="Show post action menu"></span></a></div> <ul class="mw-ui-button-container flow-list"> <section><li><a class="mw-ui-button mw-ui-quiet" href="//www.mediawiki.org/w/index.php?title=Topic:Uwqjvrjzh84larvx&topic_showPostId=wovczoik2vzlb3qb#flow-post-wovczoik2vzlb3qb"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-link"><span>Permalink</span></span></a></li></section> <section></section> </ul> </div> </div> <div class="flow-replies"> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <form class="flow-post flow-reply-form" method="POST" action="" id="flow-reply-uwqjvrjzh84larvx" > <input type="hidden" name="wpEditToken" value="+\" /> <input type="hidden" name="topic_replyTo" value="uwqjvrjzh84larvx" /> <div class="flow-error-container"> </div> <div class="flow-anon-warning"> <div class="flow-anon-warning-mobile"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-down flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> <script name="handlebars-template-progressive-enhancement" type="text/x-handlebars-template-progressive-enhancement" data-type="insert" > <div class="flow-anon-warning-desktop"> <div class="flow-form-collapsible flow-ui-tooltip mw-ui-progressive flow-ui-tooltip-left flow-ui-tooltip-block plainlinks">You are not logged in. To receive attribution with your name instead of your IP address, you can <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin?returnto=Talk%3ABest_practices_for_extensions">log in</a> or <a class="external text" href="https://www.mediawiki.org/wiki/Special:UserLogin/signup?returnto=Talk%3ABest_practices_for_extensions">create an account</a>.<span class="flow-ui-tooltip-triangle"></span> </div> </div> </flowprogressivescript></div> <div class="flow-editor"> <textarea id="flow-post-uwqjvrjzh84larvx-form-content" name="topic_content" required class="mw-ui-input flow-click-interactive mw-editfont-monospace" type="text" placeholder="Reply to "Don't: subclass anything not intended to be subclassed by extensions"" data-role="content" ></textarea> </div> <div class="flow-form-actions flow-form-collapsible"> <button data-role="submit" class="mw-ui-button mw-ui-progressive" >Reply</button> <small class="flow-terms-of-use plainlinks">By clicking "Reply", you agree to our <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and agree to irrevocably release your text under the <a rel="nofollow" class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">CC BY-SA 4.0 License</a> and <a class="external text" href="https://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License">GFDL</a>.</small> </div> </form> </script></div> <div class="flow-load-more"> <div class="flow-error-container"> </div> <div class="flow-ui-loading"><div class="mw-ui-icon mw-ui-icon-before mw-ui-icon-only mw-ui-icon-advanced"></div></div> <a data-flow-interactive-handler="apiRequest" data-flow-api-handler="loadMoreTopics" data-flow-api-target="< .flow-load-more" data-flow-load-handler="loadMore" data-flow-scroll-target="window" data-flow-scroll-container="< .flow-topics" data-flow-template="flow_topiclist_loop.partial" href="//www.mediawiki.org/w/index.php?title=Talk:Best_practices_for_extensions&topiclist_offset-dir=fwd&topiclist_limit=10&topiclist_offset=20220127024916&topiclist_sortby=updated" title="fwd" class="mw-ui-button mw-ui-progressive flow-load-interactive flow-ui-fallback-element"><span class="mw-ui-icon mw-ui-icon-before mw-ui-icon-article-invert"></span> Load more</a> </div> </div> </div> <div class="flow-ui-load-overlay"></div> <div style="clear: both"></div> </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://www.mediawiki.org/wiki/Talk:Best_practices_for_extensions">https://www.mediawiki.org/wiki/Talk:Best_practices_for_extensions</a>"</div></div> <div id="catlinks" class="catlinks catlinks-allhidden" data-mw="interface"></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <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. Text in <a class="external text" href="https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents">the Help: namespace</a> is available under the <a rel="nofollow" class="external text" href="https://creativecommons.org/publicdomain/zero/1.0/">Creative Commons CC0 License</a>. By using this site, you agree to the <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use">Terms of Use</a> and <a class="external text" href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy Policy</a>.</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/Project:About">About mediawiki.org</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Project:General_disclaimer">Disclaimers</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://www.mediawiki.org/wiki/Special:MyLanguage/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/#/www.mediawiki.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="//m.mediawiki.org/w/index.php?title=Talk:Best_practices_for_extensions&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.log.warn("This page is using the deprecated ResourceLoader module \"mediawiki.ui\".\n[1.41] Please use Codex. See migration guidelines: https://www.mediawiki.org/wiki/Codex/Migrating_from_MediaWiki_UI");mw.log.warn("This page is using the deprecated ResourceLoader module \"mediawiki.ui.button\".\n[1.41] Please use Codex. See migration guidelines: https://www.mediawiki.org/wiki/Codex/Migrating_from_MediaWiki_UI");mw.log.warn("This page is using the deprecated ResourceLoader module \"mediawiki.ui.input\".\n[1.41] Please use Codex. See migration guidelines: https://www.mediawiki.org/wiki/Codex/Migrating_from_MediaWiki_UI");mw.log.warn("This page is using the deprecated ResourceLoader module \"mediawiki.ui.icon\".\n[1.41] Please use Codex. See migration guidelines: https://www.mediawiki.org/wiki/Codex/Migrating_from_MediaWiki_UI");mw.config.set({"wgHostname":"mw-web.codfw.main-f69cdc8f6-dxng5","wgBackendResponseTime":902});});</script> </body> </html>