"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4027],{3905:function(e,t,o){o.d(t,{Zo:function(){return s},kt:function(){return d}});var n=o(7294);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function i(e){for(var t=1;t<arguments.length;t++){var o=null!=arguments[t]?arguments[t]:{};t%2?a(Object(o),!0).forEach((function(t){r(e,t,o[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):a(Object(o)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))}))}return e}function m(e,t){if(null==e)return{};var o,n,r=function(e,t){if(null==e)return{};var o,n,r={},a=Object.keys(e);for(n=0;n<a.length;n++)o=a[n],t.indexOf(o)>=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)o=a[n],t.indexOf(o)>=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=n.createContext({}),l=function(e){var t=n.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},s=function(e){var t=l(e.components);return n.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var o=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=m(e,["components","mdxType","originalType","parentName"]),u=l(o),d=r,h=u["".concat(c,".").concat(d)]||u[d]||p[d]||a;return o?n.createElement(h,i(i({ref:t},s),{},{components:o})):n.createElement(h,i({ref:t},s))}));function d(e,t){var o=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=o.length,i=new Array(a);i[0]=u;var m={};for(var c in t)hasOwnProperty.call(t,c)&&(m[c]=t[c]);m.originalType=e,m.mdxType="string"==typeof e?e:r,i[1]=m;for(var l=2;l<a;l++)i[l]=o[l];return n.createElement.apply(null,i)}return n.createElement.apply(null,o)}u.displayName="MDXCreateElement"},1680:function(e,t,o){o.r(t),o.d(t,{assets:function(){return s},contentTitle:function(){return c},default:function(){return d},frontMatter:function(){return m},metadata:function(){return l},toc:function(){return p}});var n=o(7462),r=o(3366),a=(o(7294),o(3905)),i=["components"],m={title:"How to vote a Committer or PMC"},c=void 0,l={unversionedId:"community/HowToVoteCommitterOrPMC",id:"version-0.7.0/community/HowToVoteCommitterOrPMC",title:"How to vote a Committer or PMC",description:"\x3c!--",source:"@site/versioned_docs/version-0.7.0/community/HowToVoteCommitterOrPMC.md",sourceDirName:"community",slug:"/community/HowToVoteCommitterOrPMC",permalink:"/docs/community/HowToVoteCommitterOrPMC",editUrl:"https://github.com/apache/submarine/edit/master/website/versioned_docs/version-0.7.0/community/HowToVoteCommitterOrPMC.md",tags:[],version:"0.7.0",frontMatter:{title:"How to vote a Committer or PMC"},sidebar:"docs",previous:{title:"How To Contribute to Submarine",permalink:"/docs/community/contributing"},next:{title:"How to become a Committer",permalink:"/docs/community/HowToBecomeCommitter"}},s={},p=[{value:"The voting process of becoming a Submarine Committer or PMC",id:"the-voting-process-of-becoming-a-submarine-committer-or-pmc",level:3}],u={toc:p};function d(e){var t=e.components,o=(0,r.Z)(e,i);return(0,a.kt)("wrapper",(0,n.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h3",{id:"the-voting-process-of-becoming-a-submarine-committer-or-pmc"},"The voting process of becoming a Submarine Committer or PMC"),(0,a.kt)("ol",null,(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"After the PMC members of Submarine discover any valuable contributions from the community contributors and obtain the consent of the candidate, they initiate a discussion on the private mailing list of Submarine:"),(0,a.kt)("blockquote",{parentName:"li"},(0,a.kt)("p",{parentName:"blockquote"},"[DISCUSS]"," YYYYY as a Submarine XXXXXX")),(0,a.kt)("p",{parentName:"li"},"In the email, the source of the candidate\u2019s contributions should be clearly stated, so that everyone can discuss and analyze. The discussion email will last at least 72 hours, and the project team members, including the mentors, will fully express their views on the proposed email.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"Regardless of whether there is a disagreement, after the discussion email, the vote initiator needs to initiate a Committer or PMC vote on the private mailing list of Submarine;"),(0,a.kt)("blockquote",{parentName:"li"},(0,a.kt)("p",{parentName:"blockquote"},"[VOTE]"," YYYYY as a Submarine XXXXXX")),(0,a.kt)("p",{parentName:"li"},"The voting mail should last for at least 72 hours, and there should be at least 3 +1 votes to pass the vote. If there are 0 votes or one -1 vote, the entire vote will fail. If voting -1, you need to clarify the question so that everyone can understand.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"After the voting email is over, the vote initiator should summarize it on the voting line, remind the end of voting, and send it to the voting summary email."),(0,a.kt)("blockquote",{parentName:"li"},(0,a.kt)("p",{parentName:"blockquote"},"[RESULTS][vote]"," YYYYY as a Submarine XXXXXX"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"After the vote summary email is sent, if the vote passed, the vote initiator must send an invitation email to the candidate, and the invitation email needs the candidate to reply to accept or decline through the designated mailbox."),(0,a.kt)("blockquote",{parentName:"li"},(0,a.kt)("p",{parentName:"blockquote"},"[Invitation]"," Invitation to join Apache Submarine as a XXXXXX")),(0,a.kt)("p",{parentName:"li"},"The email should be sent to the candidate, and the copy is sent to ",(0,a.kt)("a",{parentName:"p",href:"mailto:private@submarine.apache.org"},"private@submarine.apache.org"))),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"After the candidate accepts the invitation, if the candidate does not have an apache email account, the vote initiator needs to assist the candidate to create an apache account according to the guidelines.")),(0,a.kt)("li",{parentName:"ol"},(0,a.kt)("p",{parentName:"li"},"If the above content is completed, the vote initiator still needs to do the following two things:"),(0,a.kt)("p",{parentName:"li"},"6.1 Apply to the project leader to add project team members, and open the authority accounts for the jira and apache projects."),(0,a.kt)("p",{parentName:"li"},"6.2 Send a notification email to the ",(0,a.kt)("a",{parentName:"p",href:"mailto:dev@submarine.apache.org"},"dev@submarine.apache.org")," mail group:"),(0,a.kt)("blockquote",{parentName:"li"},(0,a.kt)("p",{parentName:"blockquote"},"[ANNOUNCE]"," New XXXXXX: YYYYY")))),(0,a.kt)("p",null,"So far, the entire process is completed, then the candidate officially becomes the Committer or PMC of Submarine."))}d.isMDXComponent=!0}}]);