-
Notifications
You must be signed in to change notification settings - Fork 6
feat(voting): add async voting process #160
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
80d96a9
68faf07
2680605
53217e5
46ce3a3
0a46e39
8b4381e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,177 @@ | ||
# TSC Voting Procedures Proposal | ||
|
||
## Summary | ||
|
||
This proposal establishes standardized voting procedures for the Hiero Technical Steering Committee (TSC) to improve decision-making efficiency while maintaining transparency and adherence to charter requirements. | ||
|
||
## Motivation | ||
|
||
Sometimes the TSC struggles to achieve qourum around key decisions or requires additional time outside of a meeting to deliberate on a decision. Asynchronous voting through Github Pull Requests would enable both flexibility and a solution for voting outside of the short meeting window. | ||
|
||
## Proposal Details | ||
|
||
## Voting Methods | ||
|
||
### 1. In-Meeting Votes | ||
|
||
- **When Used**: For decisions during TSC meetings with quorum present | ||
- **Threshold**: Simple majority of members present | ||
- **Recording**: Documented in meeting minutes with vote counts | ||
|
||
### 2. Asynchronous Votes via GitHub Pull Request | ||
|
||
- **When Used**: | ||
- When [quorum](https://github.com/hiero-ledger/hiero/blob/main/technical-charter.md?plain=1#L206) cannot be achieved in meetings | ||
- When voting must be completed before next TSC meeting | ||
- When a TSC member requests async voting due to inability to attend meeting | ||
- For charter-mandated votes requiring 2/3 majority [per Charter section 4. iii](https://github.com/hiero-ledger/hiero/blob/main/technical-charter.md?plain=1#L209) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we can have a 2/3 in-person vote as well (and maybe would prefer that over async for important votes, if possible). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. agree - we should be consistent so that one voting method is potentially not gamed |
||
- **Location**: Pull requests in the `proposals/` directory | ||
- **Notification**: All TSC members must be notified via: | ||
- GitHub PR mention (@username) | ||
- Slack notification in TSC channel | ||
|
||
## Voting Process for In-Meeting Votes | ||
|
||
### Step 1: Proposal Introduction | ||
- Present the proposal during TSC meeting | ||
- Allow for discussion and clarification | ||
|
||
### Step 2: Call for Vote | ||
- TSC Chair or designee calls for vote | ||
- Confirm [quorum](https://github.com/hiero-ledger/hiero/blob/main/technical-charter.md?plain=1#L206) is present | ||
|
||
### Step 3: Voting | ||
- Members vote verbally or via meeting platform | ||
- Record each member's vote | ||
|
||
### Step 4: Resolution | ||
- Tally votes and announce result | ||
- Document in meeting minutes with vote counts | ||
|
||
## Voting Process for Asynchronous Votes | ||
|
||
### Step 1: Discussion (Optional) | ||
|
||
- Create a GitHub Discussion for complex proposals requiring discussion | ||
- Label with "tsc-discussion" | ||
- No formal timeline - continue until consensus on proposal language | ||
|
||
### Step 2: Proposal Creation | ||
|
||
1. Create a new file in `proposals/` directory following the template | ||
2. File naming convention: `YYYY-MM-DD-brief-description.md` | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I'm not sure the date is going to be useful here. What if we had a proposal number, similar to HIP numbers, where the number is the PR number. Then we get some kind of sequence? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That makes sense - let's leverage what can be implemented natively to reduce confusion with potentially arbitrary numbers, etc. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
My thinking on the date is that it would provide providence on when the proposal was issued in relation to the cadence of meetings without needing to look at the commit date. If we'd like to remove it, I'm indifferent. The only issue I would flag for using PR numbers is it is often a two-step process if you calculate the name of the proposal incorrectly through the PR. Feel free to edit the PR with any combination of approaches here, as I'll be out of office next week and don't want to be a blocker here. |
||
3. Open a Pull Request with the finalized proposal | ||
4. **Proposal is immutable once PR is opened** - no changes allowed | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we simply clear all approvals if the file is changed, would this also work? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I was looking at it from a strictly immutable lens, but of course the Github configuration settings could get in the way here. If discussion is required, it could happen outside of the PR per step 1. If changes are required that were not accurately reflected in the discussion it should require closing the PR and reopening a new one with a clear history / new proposal, similar to how decentralized governance works today commonly. Once you attribute your tokens to a YES or NO answer, you cannot change that vote. Again, open to amendment / commits here, the initial flow is just a recommendation |
||
5. Link to discussion issue if one exists | ||
|
||
### Step 3: Voting Period | ||
|
||
- **Duration**: 14 calendar days maximum | ||
- **Purpose**: Voting only (discussion happens in issue, not PR) | ||
- **Voting Method**: | ||
- Approve PR = "Yes" vote | ||
- Request Changes and clearly specify disagreement with the proposal = "No" vote | ||
- No response = Abstention | ||
- **Comments**: Brief rationale only - substantive discussion in linked issue | ||
|
||
### Step 4: Resolution | ||
|
||
- **Passing Threshold**: | ||
- Standard decisions: >50% of eligible voting members | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. We should sync with LF / LFDT and check if there are best practice documents for async voting. If yes we maybe can depend on those definitons. I will check that (maybe with @jwagantall ) |
||
- Charter-specified decisions: As defined in charter (e.g., 2/3 for license exceptions) | ||
- **Early Resolution**: Vote concludes immediately when: | ||
- More than 50% of eligible members vote "Yes" (proposal passes) | ||
- More than 50% of eligible members vote "No" (proposal fails) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we vote "no" by leaving a comment on the PR? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I like that approach, and good nudge to have that documented. |
||
- Mathematically impossible to change outcome | ||
- **Quorum**: Minimum participation of 50% of eligible voting members | ||
- **Recording**: | ||
- If passed: Merge PR, then create follow-up PR to add voting record | ||
- If failed: Close PR with comment summarizing results | ||
|
||
## Voting Eligibility | ||
|
||
### Prerequisites | ||
|
||
- All TSC members must have a GitHub account to participate in voting | ||
|
||
### Active Voting Members | ||
|
||
- All TSC members listed in README.md | ||
- Have not missed the required number of consecutive TSC meetings defined in the [charter](https://github.com/hiero-ledger/hiero/blob/main/technical-charter.md?plain=1#L171) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This will not be needed if we modify the charter to eliminate this requirement |
||
- Have GitHub account with appropriate repository access | ||
|
||
### Eligibility Tracking | ||
|
||
- Maintain eligibility status in `tsc-voting-eligibility.md` | ||
- Update after each meeting | ||
- Include: | ||
- Member name | ||
- GitHub username | ||
- Voting status (active/suspended) | ||
- Last meeting attended | ||
|
||
## Special Voting Scenarios | ||
|
||
### Tied Votes | ||
|
||
- **Resolution**: | ||
- If tied: Proposal fails | ||
|
||
## Templates | ||
|
||
### Proposal Template | ||
|
||
See [proposal-template.md](./proposal-template.md) for the standard proposal format. This voting procedures proposal itself follows this template. | ||
kantorcodes marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
### Voting Record Template | ||
|
||
For passed proposals only, create a follow-up PR to append the voting record to the merged proposal. This creates a permanent record while maintaining the immutability of proposals during voting. | ||
|
||
**Usage for Passed Proposals:** | ||
1. After merging the proposal PR, create a new PR | ||
2. Add a new `## Voting Record` section at the end of the proposal document | ||
3. Fill in the template from [voting-record-template.md](./voting-record-template.md) | ||
4. Title the PR: "Add voting record to [proposal name]" | ||
5. This administrative PR can be merged without formal voting | ||
|
||
For failed proposals, the voting results are documented in the closing comment of the PR. | ||
|
||
### TSC Voting Eligibility Example | ||
|
||
See [tsc-voting-eligibility-example.md](./tsc-voting-eligibility-example.md) for an example of how to track member voting eligibility. | ||
|
||
## Impact | ||
|
||
- **Technical impact**: Leverages GitHub's existing PR review system for voting infrastructure | ||
- **Community impact**: Increases transparency through public voting records | ||
- **Timeline considerations**: 14-day maximum voting period balances thoroughness with efficiency | ||
|
||
## Alternatives Considered | ||
|
||
1. **Email-based voting**: Rejected due to lack of transparency and difficulty tracking votes | ||
2. **Dedicated voting platform**: Rejected due to additional tooling complexity | ||
3. **Status quo (meeting-only votes)**: Rejected due to ongoing quorum challenges | ||
|
||
## Proposed Charter Modifications | ||
|
||
To implement this proposal effectively, the following charter modification is recommended: | ||
|
||
### Meeting Attendance Requirement | ||
|
||
Modify section 3(ix)(d)(d) to reduce reinstatement requirement from two meetings to one: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What if we simply removed the "attend the meeting" requirement for voting eligibility. Then we wouldn't have to track attendance for voting purposes. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think @popowycz mentioned that it was added to help create incentives on participation, I'm personally indifferent either way There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. He's right, that was the original intent. The concern expressed at the time was that people would not participate in the meetings, but then still vote, and having participation is healthy for an open source project. On the downside, it is a lot of overhead to maintain the list of who can vote when, and can cause us to take incorrect votes if we get it wrong. There is a different control though -- if a TSC member becomes inactive, we can vote them out. We don't want MIA members, but maybe penalizing through voting is too cumbersome a mechanism. Maybe if we're having a problem with participation, we ask them to either participate or step aside so new people who are eager to participate can join, and if they refuse and still don't step up, then we can vote them out for failure to fulfill their responsibilities. Or maybe there is a different incentive mechanism that doesn't make the voting process so cumbersome. I'm not sure. |
||
|
||
> Any TSC member, including permanent members, that misses three (3) consecutive meetings shall be automatically suspended from eligibility to vote, i.e. no longer considered an active member, until having attended a meeting. For avoidance of doubt, the suspended TSC member shall be eligible to vote in the meeting following their absence. | ||
|
||
### Voting Threshold Clarification | ||
|
||
Add explicit language that standard decisions require >50% of eligible voting members (currently implied but not stated). | ||
|
||
Note: These changes are not proposed as part of this proposal, but are included for completeness and should be considered for a future charter amendment. | ||
|
||
## Review | ||
|
||
This procedure should be reviewed after 6 months of implementation and adjusted based on TSC experience. | ||
|
||
--- | ||
|
||
*Note: This proposal follows the format defined in [proposal-template.md](./proposal-template.md) and serves as the first example of the asynchronous voting process it establishes. As the foundational governance proposal, this PR may be amended based on feedback during the voting period to ensure the process is properly established, bypassing the immutable rule defined in proposal itself.* |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
Fields marked with * are required for a valid proposal | ||
|
||
------------------ | ||
|
||
# [Proposal Title] * | ||
|
||
## Summary * | ||
|
||
Brief description of the proposal | ||
|
||
## Motivation * | ||
|
||
Why this decision is needed | ||
|
||
## Proposal Details * | ||
|
||
Detailed description of what is being proposed | ||
|
||
## Impact * | ||
|
||
- Technical impact | ||
- Community impact | ||
- Timeline considerations | ||
|
||
## Alternatives Considered | ||
|
||
Other options that were evaluated |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# TSC Voting Eligibility | ||
|
||
Last Updated: YYYY-MM-DD | ||
|
||
## Active Voting Members | ||
|
||
| Member | GitHub Username | Status | Last Meeting Attended | | ||
| ------------- | --------------- | --------- | --------------------- | | ||
| Jane Doe | @janedoe | Active | 2024-01-15 | | ||
| John Smith | @jsmith | Active | 2024-01-15 | | ||
| Alice Johnson | @alicej | Active | 2024-01-08 | | ||
| Bob Wilson | @bwilson | Suspended | 2023-12-01 | | ||
|
||
## Suspension Notes | ||
|
||
- Bob Wilson: Suspended due to missing 3 consecutive meetings (2023-12-15, 2024-01-08, 2024-01-15) | ||
|
||
## Eligibility Rules | ||
|
||
- Missing 3 consecutive TSC meetings results in automatic voting suspension | ||
- Reinstatement occurs upon attendance at next TSC meeting |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
# Voting Record Template | ||
|
||
*This template should be appended to the proposal document in a new section after voting concludes.* | ||
|
||
--- | ||
|
||
## Voting Record | ||
|
||
**Voting Period**: YYYY-MM-DD to YYYY-MM-DD | ||
**Eligible Voters**: X | ||
**Votes Required**: Y | ||
|
||
### Results | ||
|
||
- **"Yes"**: X votes | ||
- @member1 | ||
- @member2 | ||
- **"No"**: Y votes | ||
- @member3 | ||
- **Abstain**: Z members | ||
- @member4 | ||
|
||
**Decision**: [Passed | Failed] | ||
|
||
### Notes | ||
|
||
[Any relevant notes about the voting process or outcome] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it would be good for in-meeting votes to also have a proposal that is merged into the repo. Whether it is in-person, or asynchronous, there would be a proposal. Often we've had a vote but in retrospect we have a different recollection of what we voted for. Having it written down plain, that we can go back to and reference, would be an improvement over our current way of working. It also means we have a very clear and publicly accessible record of what we voted for.