Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 25 additions & 4 deletions docs/who-makes-ubuntu/councils/dmb-meetings.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,35 @@ 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`.

## Quorum
At the end of every meeting, we try to pre-select the next meeting's chair.

[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 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).
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does this imply that future DMB members must have google accounts?
If this is the case, how easy would it be to move away from google once we start hosting all of our logs there?

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

Expand Down
48 changes: 12 additions & 36 deletions docs/who-makes-ubuntu/councils/dmb-rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
47 changes: 47 additions & 0 deletions docs/who-makes-ubuntu/councils/dmb-vote-code.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
---
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)
* Also earlier [Quorum was publicly discussed](https://discourse.ubuntu.com/t/open-discussion-meetings-quorum/5966) on the community forum.

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".

: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")
```