From ca438652cfe04af508cd6f1692846beda7bb2fcb Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Wed, 1 Oct 2025 17:59:00 +0200 Subject: [PATCH 1/5] DMB: reduce the complexity of the voting description The text used to be in two places, due to former times struggling with attendees it is very complex. This is not changing the rules, but making it quite readable, unifying the two we moved together and moving the daunting code example out of the first read experience. Signed-off-by: Christian Ehrhardt --- docs/who-makes-ubuntu/councils/dmb-rules.md | 48 +++++------------ .../councils/dmb-vote-code.md | 52 +++++++++++++++++++ 2 files changed, 64 insertions(+), 36 deletions(-) create mode 100644 docs/who-makes-ubuntu/councils/dmb-vote-code.md diff --git a/docs/who-makes-ubuntu/councils/dmb-rules.md b/docs/who-makes-ubuntu/councils/dmb-rules.md index e899fe71..40c0b668 100644 --- a/docs/who-makes-ubuntu/councils/dmb-rules.md +++ b/docs/who-makes-ubuntu/councils/dmb-rules.md @@ -22,54 +22,30 @@ This rule [was proposed](https://lists.ubuntu.com/archives/devel-permissions/202 (dmb-voting-and-quorum)= ## Voting and quorum -Applications must reach +1 in order to pass. -If the meeting is quorate and all members present vote in the same way (+1 or -1), then the application will have passed or failed -- the remaining members cannot overturn the vote. -If the vote is in doubt then it is *hung* and the remaining members will be asked to vote by email or at the next meeting. -In this case those members are entitled to ask the applicant further questions if they still have any upon reviewing the meeting log. +* The total number of active board members should be 7, with a quorum of 4. -> Quorum votes are required to make any decision., however if quorum is not reached at first meeting, at the next meeting majority present votes are required. +* We don't require quorum to hold meetings, we only require 'quorum' during voting -The details for this rule, and **quorum** voting in particular, are not always clear, so the TL:DR for this rule is, any proposal or application that is voted on at a regular meeting must use the process shown in the Python function below; -if the function does not result in pass or fail, then at the next scheduled meeting, the vote will pass with only a majority of present members (meaning the sum of votes from present members must be greater than 0). +* Members vote on applications or proposals by giving -1 (reject), 0 (abstain), or +1 (approve) -```{note} -This rule was proposed and approved in a [mailing list thread](https://lists.ubuntu.com/archives/devel-permissions/2021-August/001728.html), that was discussed and then [extended to a poll](https://lists.ubuntu.com/archives/devel-permissions/2021-October/001756.html) for which [the results](https://lists.ubuntu.com/archives/devel-permissions/2021-November/001782.html) are explained below. -``` - -As *quorum* can be difficult to parse under all circumstances, an explanation from a [mailing list post](https://lists.ubuntu.com/archives/devel-permissions/2021-October/001763.html) (and [follow up post](https://lists.ubuntu.com/archives/devel-permissions/2021-October/001764.html) for a tie vote) is summarized in this Python function, where `total_members` is the total number of **active** board members (which is typically 7): - -```none -def do_vote(*votes, total_members=7): - - absent = total_members - len(votes) - - net_vote = sum(votes) +* The sum of all votes given must reach >0 (a majority) to pass a vote. - min = net_vote - absent +* The vote must be quorate for it to be valid. - max = net_vote + absent + * However if quorum is not reached at first meeting, then at the next meeting a "majority of present votes" is sufficient to pass. - if min > 0: +* If the meeting is quorate and all members present vote in the same way (+1 or -1), then the application will have passed or failed -- the remaining members cannot overturn the vote. However if the verdict was not unanimous, then the remaining members will be asked to vote by email or at the next meeting. - print(f'Vote minimum {min} > 0, vote passes') +* If the vote is in doubt (for example, if 4 members are present and the vote is tied) then it is *hung* and the remaining members will be asked to vote by email or at the next meeting. - elif max < 0: +* In the case of a deferred email or next-meeting vote, those members are entitled to ask the applicant further questions if they still have any upon reviewing the meeting log (or recording). - print(f'Vote maximum {max} < 0, vote fails') - elif min == max == net_vote == 0: - - print(f'Vote is tied, vote fails') - - else: - - print(f'Vote is between {min} and {max}, outcome unknown as quorum was not reached') +```{note} +These rules are complex, a different approach to make it less misunderstandable +is by expressing it as a {ref}`dmb-vote-function`. ``` -This function represents the meaning of **quorum** votes. -Note that if **`total_members`** is 7, if the number of voters is less than 4, it is impossible to pass or fail. - - (dmb-application-communication)= ## Application-related communication diff --git a/docs/who-makes-ubuntu/councils/dmb-vote-code.md b/docs/who-makes-ubuntu/councils/dmb-vote-code.md new file mode 100644 index 00000000..22d823d1 --- /dev/null +++ b/docs/who-makes-ubuntu/councils/dmb-vote-code.md @@ -0,0 +1,52 @@ +--- +orphan: true +--- + +(dmb-vote-function)= +# DMB vote funtion + +The text on {ref}`dmb-rules` should be easier to consume, but if in doubt +here a different way to express it. + +These rules were proposed in +* this [mailing list thread](https://lists.ubuntu.com/archives/devel-permissions/2021-August/001728.html) +* then [extended to a poll](https://lists.ubuntu.com/archives/devel-permissions/2021-October/001756.html) +* with the [results](https://lists.ubuntu.com/archives/devel-permissions/2021-November/001782.html) +* then [clarified again](https://lists.ubuntu.com/archives/devel-permissions/2021-October/001763.html) +* and [finalized](https://lists.ubuntu.com/archives/devel-permissions/2021-October/001764.html) + +Summarized in this Python-like function: + +```python + +def do_vote(votes, total_members=7): + """ + Print the outcome of the vote + + :param votes - a list of votes given being -1,0 or +1 + :param total_members - active members of the DMB + """ + absent = total_members - len(votes) + + net_vote = sum(votes) + + min = net_vote - absent + + max = net_vote + absent + + if min > 0: + + print(f'Vote minimum {min} > 0, vote passes') + + elif max < 0: + + print(f'Vote maximum {max} < 0, vote fails') + + elif min == max == net_vote == 0: + + print(f'Vote is tied, vote fails') + + else: + + print(f'Vote is between {min} and {max}, outcome unknown as quorum was not reached') +``` From d67239630086535839f5015c9d86ae8ff2a29fb8 Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Thu, 2 Oct 2025 08:28:00 +0200 Subject: [PATCH 2/5] DMB: keep qorum and voting in one place We yet again have two places trying to explain. Clarify what the chair does in the chair section and only refer to the one place we go into detail on qorum and voting. Signed-off-by: Christian Ehrhardt --- docs/who-makes-ubuntu/councils/dmb-meetings.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/who-makes-ubuntu/councils/dmb-meetings.md b/docs/who-makes-ubuntu/councils/dmb-meetings.md index 1b53ca84..dcc2ff46 100644 --- a/docs/who-makes-ubuntu/councils/dmb-meetings.md +++ b/docs/who-makes-ubuntu/councils/dmb-meetings.md @@ -24,11 +24,9 @@ The meeting starts on Matrix in the {matrix}`meeting` channel, and we then offer We share the responsibility of chairing the meetings. At the end of every meeting, we pre-select the next meeting's chair. - -## Quorum - -[Quorum was originally publicly discussed](https://discourse.ubuntu.com/t/open-discussion-meetings-quorum/5966) on the community forum. -The specific meaning of **quorum** for voting [was later clarified](https://lists.ubuntu.com/archives/devel-permissions/2021-October/001763.html) and is explained in the {ref}`dmb-voting-and-quorum` section. +The chair drives the meeting according the agenda, ensures we are following +the rules of the {ref}`dmb-voting-and-quorum` section, assigns follow up tasks +like {ref}`dmb-application-communication`. ## General progress during meetings From 57232187325cf8567231156878a591aff472e76d Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Thu, 2 Oct 2025 08:29:09 +0200 Subject: [PATCH 3/5] DMB: be honest about chair selection Signed-off-by: Christian Ehrhardt --- docs/who-makes-ubuntu/councils/dmb-meetings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/who-makes-ubuntu/councils/dmb-meetings.md b/docs/who-makes-ubuntu/councils/dmb-meetings.md index dcc2ff46..dbc8ae34 100644 --- a/docs/who-makes-ubuntu/councils/dmb-meetings.md +++ b/docs/who-makes-ubuntu/councils/dmb-meetings.md @@ -22,12 +22,12 @@ The meeting starts on Matrix in the {matrix}`meeting` channel, and we then offer ## Chair We share the responsibility of chairing the meetings. -At the end of every meeting, we pre-select the next meeting's chair. The chair drives the meeting according the agenda, ensures we are following the rules of the {ref}`dmb-voting-and-quorum` section, assigns follow up tasks like {ref}`dmb-application-communication`. +At the end of every meeting, we try to pre-select the next meeting's chair. ## General progress during meetings From 5ed7d883daf7b20cfc709d710dc400a3ee7ef21e Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Thu, 2 Oct 2025 09:06:09 +0200 Subject: [PATCH 4/5] DMB: make code actually match the text The text had several cases which were not in the code like the follow up or the consequence of a lack of qorum. While not convinced that we would still need/want the code, if we do make it match the text more closely. Signed-off-by: Christian Ehrhardt --- .../councils/dmb-vote-code.md | 57 +++++++++---------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/docs/who-makes-ubuntu/councils/dmb-vote-code.md b/docs/who-makes-ubuntu/councils/dmb-vote-code.md index 22d823d1..462c827d 100644 --- a/docs/who-makes-ubuntu/councils/dmb-vote-code.md +++ b/docs/who-makes-ubuntu/councils/dmb-vote-code.md @@ -14,39 +14,34 @@ These rules were proposed in * with the [results](https://lists.ubuntu.com/archives/devel-permissions/2021-November/001782.html) * then [clarified again](https://lists.ubuntu.com/archives/devel-permissions/2021-October/001763.html) * and [finalized](https://lists.ubuntu.com/archives/devel-permissions/2021-October/001764.html) +* Also earlier [Quorum was publicly discussed](https://discourse.ubuntu.com/t/open-discussion-meetings-quorum/5966) on the community forum. -Summarized in this Python-like function: +All that is summarized in this Python-like function: ```python - def do_vote(votes, total_members=7): - """ - Print the outcome of the vote - - :param votes - a list of votes given being -1,0 or +1 - :param total_members - active members of the DMB - """ - absent = total_members - len(votes) - - net_vote = sum(votes) - - min = net_vote - absent - - max = net_vote + absent - - if min > 0: - - print(f'Vote minimum {min} > 0, vote passes') - - elif max < 0: - - print(f'Vote maximum {max} < 0, vote fails') - - elif min == max == net_vote == 0: - - print(f'Vote is tied, vote fails') - - else: - - print(f'Vote is between {min} and {max}, outcome unknown as quorum was not reached') + """ + This function prints exactly one of: "passed", "failed", "hung", "require follow up". + + :param votes: list of integers (-1, 0, +1) representing votes cast by members present + :param total_members: int, number of active board members (default 7) + """ + quorum = 4 + dmb_members_present = len(votes) + sum_of_votes = sum(votes) + non_abstain_votes = [v for v in votes if v != 0] + if dmb_members_present >= quorum: + # unanimous among dmb_members_present non-abstain voters + if non_abstain_votes and all(v == 1 for v in non_abstain): + print("passed and final") + if non_abstain_votes and all(v == -1 for v in non_abstain): + print("failed and final") + if sum_of_votes > 0: + print("passed, but can be overturn by absent members voting by mail until or at next meeting") + if sum_of_votes < 0: + print("failed, but can be overturn by absent members voting by mail until or at next meeting") + # tie or zero sum + print("hung, absent members are asked to vote by mail until or at next meeting") + else: + print("Not quorate - require follow up, next time majority of present members votes will suffice") ``` From 4b4c84e1b02512d37d0b4a988cdcffba5a2e581e Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Thu, 2 Oct 2025 09:08:36 +0200 Subject: [PATCH 5/5] DMB: unify logs in one place Signed-off-by: Christian Ehrhardt --- .../who-makes-ubuntu/councils/dmb-meetings.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/who-makes-ubuntu/councils/dmb-meetings.md b/docs/who-makes-ubuntu/councils/dmb-meetings.md index dbc8ae34..dba089d1 100644 --- a/docs/who-makes-ubuntu/councils/dmb-meetings.md +++ b/docs/who-makes-ubuntu/councils/dmb-meetings.md @@ -29,6 +29,29 @@ like {ref}`dmb-application-communication`. At the end of every meeting, we try to pre-select the next meeting's chair. +The chair is furthermore repsonsible to ensure that {ref}`meeting-logs` are made +publicly available. + +(meeting-logs)= +## Meeting Logs + +Over the years there have been many forms of meeiting logs, sites logging IRC, +[meetingology](https://wiki.ubuntu.com/meetingology) based logs, +missed logs :-/, mail summaries and more. When experimenting to offer video +calls for more efficient evaluation of the candidate more types like textfiles, +auto generated logs, google docs or video recording got used. + +The goals of these logs is to: +- allow to retrace how people have been evaluated +- allow to refer to when a decision was done +- allow someone to prepare for an application based on former ones + +To be able to do that a public accessible folder for the +[DMB Meeting logs](https://drive.google.com/drive/u/1/folders/18n6c0AjNnMwYg17DYQZcP3ge_1Kx5W0d). +was established. Old logs, from the different sources of the past, got added +and now allow searching across all of them as well as an easy way to download +all for any other kind of processing. + ## General progress during meetings In January 2023 the DMB agreed to the following.