From 5c83b82840dcd25706bf47123b433960ca2a12b3 Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Wed, 1 Oct 2025 17:59:00 +0200 Subject: [PATCH 01/11] 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 6e58e52676f4e63967db6e14e7406a2b65344d69 Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Thu, 2 Oct 2025 08:28:00 +0200 Subject: [PATCH 02/11] 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 bfd6cc8b47a0e33a97d5a4a09abb35b0b8a4f2a2 Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Thu, 2 Oct 2025 08:29:09 +0200 Subject: [PATCH 03/11] 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 5ffd508804affedbfa570f920169642a1f8a75fb Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Thu, 2 Oct 2025 09:06:09 +0200 Subject: [PATCH 04/11] 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 babdff97c6e253b7d5d4ffae36877b2dbf5b3a39 Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Wed, 8 Oct 2025 08:25:50 +0200 Subject: [PATCH 05/11] DMB: Apply textual suggestions from code review Co-authored-by: Benjamin Drung --- docs/who-makes-ubuntu/councils/dmb-rules.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/who-makes-ubuntu/councils/dmb-rules.md b/docs/who-makes-ubuntu/councils/dmb-rules.md index 40c0b668..e3a11d4f 100644 --- a/docs/who-makes-ubuntu/councils/dmb-rules.md +++ b/docs/who-makes-ubuntu/councils/dmb-rules.md @@ -24,9 +24,9 @@ This rule [was proposed](https://lists.ubuntu.com/archives/devel-permissions/202 * The total number of active board members should be 7, with a quorum of 4. -* We don't require quorum to hold meetings, we only require 'quorum' during voting +* We don't require quorum to hold meetings, we only require 'quorum' during voting. -* Members vote on applications or proposals by giving -1 (reject), 0 (abstain), or +1 (approve) +* Members vote on applications or proposals by giving -1 (reject), 0 (abstain), or +1 (approve). * The sum of all votes given must reach >0 (a majority) to pass a vote. From 8c6934cca909bf2cdcee816cb9e8c2add4d220d6 Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Wed, 8 Oct 2025 08:30:58 +0200 Subject: [PATCH 06/11] DMB: make vote code return a string Suggested-by: Benjamin Drung Signed-off-by: Christian Ehrhardt --- docs/who-makes-ubuntu/councils/dmb-vote-code.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/who-makes-ubuntu/councils/dmb-vote-code.md b/docs/who-makes-ubuntu/councils/dmb-vote-code.md index 462c827d..1263a097 100644 --- a/docs/who-makes-ubuntu/councils/dmb-vote-code.md +++ b/docs/who-makes-ubuntu/councils/dmb-vote-code.md @@ -21,7 +21,7 @@ All that is summarized in this Python-like function: ```python def do_vote(votes, total_members=7): """ - This function prints exactly one of: "passed", "failed", "hung", "require follow up". + This function returns the outcome of a DMB vote as a string. :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) @@ -33,15 +33,15 @@ def do_vote(votes, total_members=7): 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") + return "passed and final" if non_abstain_votes and all(v == -1 for v in non_abstain): - print("failed and final") + return "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") + return "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") + return "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") + return "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") + return "Not quorate - require follow up, next time majority of present members votes will suffice" ``` From fd85fe08857b9dfd50271f9dd4b6988100e95cf2 Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Wed, 8 Oct 2025 08:38:06 +0200 Subject: [PATCH 07/11] DMB: improve voting function Fixed "NameError: name 'non_abstain' is not defined" Suggested-by: Benjamin Drung Signed-off-by: Christian Ehrhardt --- .../who-makes-ubuntu/councils/dmb-vote-code.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/who-makes-ubuntu/councils/dmb-vote-code.md b/docs/who-makes-ubuntu/councils/dmb-vote-code.md index 1263a097..1c27def9 100644 --- a/docs/who-makes-ubuntu/councils/dmb-vote-code.md +++ b/docs/who-makes-ubuntu/councils/dmb-vote-code.md @@ -27,19 +27,19 @@ def do_vote(votes, total_members=7): :param total_members: int, number of active board members (default 7) """ quorum = 4 - dmb_members_present = len(votes) + dmb_members_voting = 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): - return "passed and final" - if non_abstain_votes and all(v == -1 for v in non_abstain): - return "failed and final" + + if dmb_members_voting >= quorum: + if non_abstain_votes and all(v == 1 for v in non_abstain_votes): + return "qouorum and unanimous - passed and final" + if non_abstain_votes and all(v == -1 for v in non_abstain_votes): + return "qouorum and unanimous - failed and final" if sum_of_votes > 0: - return "passed, but can be overturn by absent members voting by mail until or at next meeting" + return "qouorum and passed, could be overturned by absent members voting by mail until or at next meeting" if sum_of_votes < 0: - return "failed, but can be overturn by absent members voting by mail until or at next meeting" + return "qouorum and failed, could be overturned by absent members voting by mail until or at next meeting" # tie or zero sum return "hung, absent members are asked to vote by mail until or at next meeting" else: From 01f53d4c521ad09c8869cf2112705973c6437938 Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Wed, 8 Oct 2025 08:40:04 +0200 Subject: [PATCH 08/11] DMB: improve voting function total_members is not really an argument, it is how the DMB is defined. Make it not a function argument to represent that. Signed-off-by: Christian Ehrhardt --- docs/who-makes-ubuntu/councils/dmb-vote-code.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/who-makes-ubuntu/councils/dmb-vote-code.md b/docs/who-makes-ubuntu/councils/dmb-vote-code.md index 1c27def9..bfc70fe1 100644 --- a/docs/who-makes-ubuntu/councils/dmb-vote-code.md +++ b/docs/who-makes-ubuntu/councils/dmb-vote-code.md @@ -19,14 +19,15 @@ These rules were proposed in All that is summarized in this Python-like function: ```python -def do_vote(votes, total_members=7): +def do_vote(votes): """ This function returns the outcome of a DMB vote as a string. :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 + total_members=7 + dmb_members_voting = len(votes) sum_of_votes = sum(votes) non_abstain_votes = [v for v in votes if v != 0] From 6b303c351a81dd9754cb4db63b3d0c0840a7af23 Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Wed, 8 Oct 2025 08:42:17 +0200 Subject: [PATCH 09/11] DMB: improve voting function Avoid nested if's makes it even more readable. Suggested-by: Benjamin Drung Signed-off-by: Christian Ehrhardt --- .../councils/dmb-vote-code.md | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/who-makes-ubuntu/councils/dmb-vote-code.md b/docs/who-makes-ubuntu/councils/dmb-vote-code.md index bfc70fe1..1ac2a07e 100644 --- a/docs/who-makes-ubuntu/councils/dmb-vote-code.md +++ b/docs/who-makes-ubuntu/councils/dmb-vote-code.md @@ -32,17 +32,17 @@ def do_vote(votes): sum_of_votes = sum(votes) non_abstain_votes = [v for v in votes if v != 0] - if dmb_members_voting >= quorum: - if non_abstain_votes and all(v == 1 for v in non_abstain_votes): - return "qouorum and unanimous - passed and final" - if non_abstain_votes and all(v == -1 for v in non_abstain_votes): - return "qouorum and unanimous - failed and final" - if sum_of_votes > 0: - return "qouorum and passed, could be overturned by absent members voting by mail until or at next meeting" - if sum_of_votes < 0: - return "qouorum and failed, could be overturned by absent members voting by mail until or at next meeting" - # tie or zero sum - return "hung, absent members are asked to vote by mail until or at next meeting" - else: + if dmb_members_voting < quorum: return "Not quorate - require follow up, next time majority of present members votes will suffice" + + if non_abstain_votes and all(v == 1 for v in non_abstain_votes): + return "qouorum and unanimous - passed and final" + if non_abstain_votes and all(v == -1 for v in non_abstain_votes): + return "qouorum and unanimous - failed and final" + if sum_of_votes > 0: + return "qouorum and passed, could be overturned by absent members voting by mail until or at next meeting" + if sum_of_votes < 0: + return "qouorum and failed, could be overturned by absent members voting by mail until or at next meeting" + + return "hung, absent members are asked to vote by mail until or at next meeting" ``` From 006b994f667f29f76d5e2904b785b742eae46e0a Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Wed, 8 Oct 2025 08:51:05 +0200 Subject: [PATCH 10/11] DMB: improve voting function Tracking and comparing to missing_votes makes it even more readable. It further allows to differentiate non-unanimous cases into final or needing follow up votes to come in. Suggested-by: Benjamin Drung Signed-off-by: Christian Ehrhardt --- docs/who-makes-ubuntu/councils/dmb-vote-code.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/docs/who-makes-ubuntu/councils/dmb-vote-code.md b/docs/who-makes-ubuntu/councils/dmb-vote-code.md index 1ac2a07e..5d80699b 100644 --- a/docs/who-makes-ubuntu/councils/dmb-vote-code.md +++ b/docs/who-makes-ubuntu/councils/dmb-vote-code.md @@ -29,6 +29,8 @@ def do_vote(votes): total_members=7 dmb_members_voting = len(votes) + missing_votes = total_members - dmb_members_voting + sum_of_votes = sum(votes) non_abstain_votes = [v for v in votes if v != 0] @@ -39,10 +41,18 @@ def do_vote(votes): return "qouorum and unanimous - passed and final" if non_abstain_votes and all(v == -1 for v in non_abstain_votes): return "qouorum and unanimous - failed and final" + if sum_of_votes > 0: - return "qouorum and passed, could be overturned by absent members voting by mail until or at next meeting" + if sum_of_votes > missing_votes: + return "qouorum, missing votes could not overturn it - passed and final" + else + return "qouorum and passed, but missing votes could be overturn it - absent members are asked to vote by mail until or at next meeting" + if sum_of_votes < 0: - return "qouorum and failed, could be overturned by absent members voting by mail until or at next meeting" + if abs(sum_of_votes) > missing_votes: + return "qouorum, missing votes could not overturn it - failed and final" + else: + return "qouorum and failed, but missing votes could be overturn it - absent members are asked to vote by mail until or at next meeting" return "hung, absent members are asked to vote by mail until or at next meeting" ``` From 2b9b4d1ab4aabc4cbcc2312ed00604bdffb900a0 Mon Sep 17 00:00:00 2001 From: Christian Ehrhardt Date: Wed, 8 Oct 2025 08:54:17 +0200 Subject: [PATCH 11/11] DMB: fix typo in voting function qouorum -> quorum Signed-off-by: Christian Ehrhardt --- docs/who-makes-ubuntu/councils/dmb-vote-code.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/who-makes-ubuntu/councils/dmb-vote-code.md b/docs/who-makes-ubuntu/councils/dmb-vote-code.md index 5d80699b..ea182542 100644 --- a/docs/who-makes-ubuntu/councils/dmb-vote-code.md +++ b/docs/who-makes-ubuntu/councils/dmb-vote-code.md @@ -38,21 +38,21 @@ def do_vote(votes): return "Not quorate - require follow up, next time majority of present members votes will suffice" if non_abstain_votes and all(v == 1 for v in non_abstain_votes): - return "qouorum and unanimous - passed and final" + return "quorum and unanimous - passed and final" if non_abstain_votes and all(v == -1 for v in non_abstain_votes): - return "qouorum and unanimous - failed and final" + return "quorum and unanimous - failed and final" if sum_of_votes > 0: if sum_of_votes > missing_votes: - return "qouorum, missing votes could not overturn it - passed and final" + return "quorum, missing votes could not overturn it - passed and final" else - return "qouorum and passed, but missing votes could be overturn it - absent members are asked to vote by mail until or at next meeting" + return "quorum and passed, but missing votes could be overturn it - absent members are asked to vote by mail until or at next meeting" if sum_of_votes < 0: if abs(sum_of_votes) > missing_votes: - return "qouorum, missing votes could not overturn it - failed and final" + return "quorum, missing votes could not overturn it - failed and final" else: - return "qouorum and failed, but missing votes could be overturn it - absent members are asked to vote by mail until or at next meeting" + return "quorum and failed, but missing votes could be overturn it - absent members are asked to vote by mail until or at next meeting" return "hung, absent members are asked to vote by mail until or at next meeting" ```