Skip to content

Commit cbaf2cf

Browse files
committed
chore: Update README.md and CHANGELOG.md
1 parent e5012e6 commit cbaf2cf

2 files changed

Lines changed: 130 additions & 28 deletions

File tree

CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,32 @@
11
# Changelog
22

33
All notable changes to ModNVote are documented in this file.
4+
## [2.1.0] - 2026-04-26
45

6+
### Added
7+
8+
- `/modnvote clone <sourcePollId>` for cloning existing polls into new editable drafts.
9+
- `/modnvote checkpoint <pollId>` for manual witness checkpoint publication.
10+
- `/poll` as a short alias for `/modnvote`.
11+
- External witness publication via configured Discord-compatible webhooks.
12+
- Poll opened witness publication.
13+
- Poll closed witness publication with result summary.
14+
- Automatic integrity checkpoint publication every configured ballot interval.
15+
- Clear first-run config guidance for webhook list formatting.
16+
17+
### Changed
18+
19+
- Poll lifecycle commands can now publish best-effort external witness events.
20+
- Vote submission can now trigger automatic privacy-safe checkpoint publication.
21+
- Config comments clarify how to configure one or more webhook URLs.
22+
23+
### Security / Privacy
24+
25+
- Witness publication does not include player names, UUIDs, IP addresses, proof phrases, participation receipts, or per-player vote content.
26+
- Webhook delivery failures are logged without exposing full webhook URLs and do not affect poll lifecycle or ballot persistence.
527
## [2.0.0] - 2026-04-25
628

29+
730
### Summary
831

932
ModNVote 2.0 replaces the original Yes/No-only plugin with a privacy-first, audit-aware polling system.

README.md

Lines changed: 107 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ Developed by [MODN METL LTD](https://modnmetl.com).
1515

1616
---
1717

18-
## ModNVote 2.0 status
18+
## ModNVote 2.x status
1919

2020
ModNVote 2.0 is the active replacement for the legacy 1.x Yes/No-only plugin.
2121

22-
2.0 introduces:
22+
2.x includes:
2323

2424
- GUI-driven poll creation and editing
2525
- Ranked single-winner polls
@@ -30,6 +30,10 @@ ModNVote 2.0 is the active replacement for the legacy 1.x Yes/No-only plugin.
3030
- Tamper-evident audit records
3131
- Java/Bedrock-friendly inventory interfaces
3232
- Mandatory confirmation before ballots are cast
33+
- Poll cloning for repeated or template-based poll setup
34+
- Optional external witness publication via Discord-compatible webhooks
35+
- Automatic and manual integrity checkpoint publication
36+
- `/poll` as a short alias for `/modnvote`
3337

3438
2.0 is a clean install target. Migration from legacy 1.x databases is not currently supported.
3539

@@ -57,6 +61,7 @@ This means:
5761
- Vote content and voter identity are not stored together.
5862
- `/modnvote verify participation` confirms participation without revealing a vote.
5963
- `/modnvote verify ballot` uses a proof phrase as a bearer-token style verification mechanism.
64+
- `/poll` may be used as a shorter alias for `/modnvote`.
6065
- GUI/session state does not directly write ballots or lifecycle state.
6166

6267
---
@@ -98,12 +103,23 @@ This creates a DRAFT Yes/No poll and opens the Poll Builder GUI.
98103

99104
---
100105

101-
### Command alias
106+
## Command alias
102107

103108
All `/modnvote` commands can also be used via the shorter alias:
104109

105110
```text
106111
/poll ...
112+
```
113+
114+
For example:
115+
116+
```text
117+
/poll create ranked_single_winner 5
118+
/poll open <pollId>
119+
/poll vote <pollId>
120+
```
121+
122+
---
107123

108124
## Admin workflow
109125

@@ -151,6 +167,16 @@ Yes/No polls do not show ranked-only settings such as Max Rankings or Allow Part
151167

152168
This reopens the Poll Builder for an existing DRAFT poll.
153169

170+
### Clone an existing poll
171+
172+
```text
173+
/modnvote clone <sourcePollId>
174+
```
175+
176+
This creates a new DRAFT poll by copying the source poll’s definition and options, then opens the Poll Builder so the clone can be adjusted.
177+
178+
Cloning does not copy ballots, participation records, lifecycle timestamps, proof phrases, or audit history.
179+
154180
### Open a poll for voting
155181

156182
```text
@@ -188,6 +214,64 @@ For ranked polls:
188214

189215
Results are calculated from anonymous ballots only.
190216

217+
### Publish a manual integrity checkpoint
218+
219+
```text
220+
/modnvote checkpoint <pollId>
221+
```
222+
223+
This publishes a privacy-safe witness checkpoint to the configured webhook targets.
224+
225+
Manual checkpoints include poll-level integrity status only. They do not publish player names, UUIDs, IP addresses, proof phrases, participation receipts, or per-player vote content.
226+
227+
---
228+
229+
## Witness publication
230+
231+
ModNVote can publish public witness events to configured Discord-compatible webhooks.
232+
233+
Supported witness events:
234+
235+
- Poll opened
236+
- Poll closed, including a public result summary
237+
- Automatic integrity checkpoints every configured number of accepted ballots
238+
- Manual integrity checkpoints via `/modnvote checkpoint <pollId>`
239+
240+
Webhook delivery is best-effort and non-blocking. A failed webhook does not cancel voting, poll opening, poll closing, or persistence.
241+
242+
Configure webhook publication in `config.yml`:
243+
244+
```yaml
245+
publication:
246+
# External witness publication targets.
247+
#
248+
# Leave this as [] to disable webhook publication:
249+
# discord_webhooks: []
250+
#
251+
# To enable Discord publication, change it to a YAML list:
252+
# discord_webhooks:
253+
# - "https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN"
254+
#
255+
# Multiple webhooks are supported:
256+
# discord_webhooks:
257+
# - "https://discord.com/api/webhooks/FIRST_WEBHOOK_ID/FIRST_WEBHOOK_TOKEN"
258+
# - "https://discord.com/api/webhooks/SECOND_WEBHOOK_ID/SECOND_WEBHOOK_TOKEN"
259+
#
260+
# Never commit real webhook URLs to source control.
261+
discord_webhooks: []
262+
publish_poll_opened: true
263+
publish_poll_closed: true
264+
publish_checkpoints: true
265+
266+
integrity:
267+
# Automatic witness checkpoints are published every N accepted ballots
268+
# when publication.publish_checkpoints is true and at least one webhook is configured.
269+
#
270+
# Set to 0 or a negative number to disable automatic interval checkpoints.
271+
checkpoint_interval_ballots: 25
272+
canonicalization_version: 1
273+
```
274+
191275
---
192276
193277
## Verification commands
@@ -220,20 +304,23 @@ Treat ballot proof phrases like bearer tokens: anyone with the phrase can verify
220304

221305
## Admin command reference
222306

307+
All commands below may use either `/modnvote` or `/poll`.
308+
223309
Normal admin-facing commands:
224-
Alias:
225-
/poll ...
310+
226311
```text
227312
/modnvote guide
228313
/modnvote create ranked_single_winner <optionCount>
229314
/modnvote create yes_no
230315
/modnvote edit <draftPollId>
316+
/modnvote clone <sourcePollId>
231317
/modnvote list
232318
/modnvote show <pollId>
233319
/modnvote delete <pollId>
234320
/modnvote open <pollId>
235321
/modnvote close <pollId>
236322
/modnvote result <pollId>
323+
/modnvote checkpoint <pollId>
237324
```
238325

239326
Player-facing commands:
@@ -252,6 +339,14 @@ Utility commands:
252339
/modnvote reload
253340
```
254341

342+
Short alias examples:
343+
344+
```text
345+
/poll status
346+
/poll guide
347+
/poll vote <pollId>
348+
```
349+
255350
Some older low-level authoring commands may remain callable as recovery tools, but normal poll setup should use the GUI builder.
256351

257352
---
@@ -264,7 +359,7 @@ Common permissions include:
264359

265360
| Permission | Purpose |
266361
|---|---|
267-
| `modnvote.admin.poll.create` | Create, edit, inspect, and manage draft polls |
362+
| `modnvote.admin.poll.create` | Create, clone, edit, inspect, checkpoint, and manage draft polls |
268363
| `modnvote.admin.poll.list` | List polls |
269364
| `modnvote.admin.poll.open` | Open polls for voting |
270365
| `modnvote.admin.poll.close` | Close polls |
@@ -363,14 +458,17 @@ Integrity checks include:
363458
- Ballot hash verification
364459
- Ballot commitment verification
365460
- Audit chain validation
461+
- Optional witness checkpoint publication
366462

367463
The goal is not to identify how someone voted. The goal is to verify that the stored election data remains internally consistent and that a voter can verify their own ballot proof phrase.
368464

465+
Witness publication can optionally publish poll-level lifecycle and checkpoint events to configured webhooks. These events are privacy-safe and do not include voter identity, proof phrases, participation receipts, IP data, or per-player vote content.
466+
369467
---
370468

371469
## Installation
372470

373-
ModNVote 2.0 currently requires a clean install.
471+
ModNVote 2.x requires a clean install (No upgrade path from v1.x).
374472

375473
1. Stop the server.
376474
2. Remove any legacy ModNVote 1.x jar.
@@ -416,36 +514,17 @@ The Java source/target level should remain Java 21 unless explicitly changed.
416514

417515
---
418516

419-
## Release smoke test
420-
421-
Recommended smoke test before release:
422-
423-
```text
424-
/modnvote create ranked_single_winner 3
425-
/modnvote create yes_no
426-
/modnvote edit <draftPollId>
427-
/modnvote open <readyPollId>
428-
/modnvote vote <openPollId>
429-
/modnvote close <openPollId>
430-
/modnvote result <closedPollId>
431-
/modnvote mypolls
432-
/modnvote verify participation <pollId>
433-
/modnvote verify ballot <pollId> <proofPhrase>
434-
```
435-
436-
---
437-
438517
## Roadmap
439518

440519
Potential future 2.x work:
441520

442521
- Multi-winner STV
443522
- Combined elections such as Mayor + Council
444-
- Exportable audit snapshots
445-
- Optional external witness publication
523+
- Exportable signed audit snapshots
446524
- Advanced reporting and dashboards
447525
- Dedicated GUI delete confirmation flow
448526
- Additional admin transparency tooling
527+
- Multi-target witness publication beyond Discord-compatible webhooks
449528

450529
---
451530

0 commit comments

Comments
 (0)