Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
6b69462
Make vote shop debit atomic
BenCodez Sep 7, 2026
4b12ebf
Test concurrent vote shop debits
BenCodez Sep 7, 2026
1d44c4b
Use stable purchase locks and async persistence
BenCodez Sep 7, 2026
70fe42f
Use stable purchase locks and async persistence
BenCodez Sep 7, 2026
a199326
Keep purchase locks stable across reloads
BenCodez Sep 7, 2026
e335aec
Keep purchase locks stable across reloads
BenCodez Sep 7, 2026
9c176fd
Address review feedback with regression coverage
BenCodez Sep 7, 2026
dd3a770
Address review feedback with regression coverage
BenCodez Sep 7, 2026
6a5cd23
Address latest review feedback
BenCodez Sep 7, 2026
ebfbc55
Make concurrent debit regression deterministic
BenCodez Sep 8, 2026
b8b695e
Merge remote-tracking branch 'origin/master' into security/pr-1600-local
BenCodez Sep 8, 2026
ca4471d
fix: make shared vote shop purchases atomic
BenCodez Sep 8, 2026
38ae0d6
Preserve synchronous shared point updates
BenCodez Sep 8, 2026
e07be21
Preserve purchase and transfer semantics
BenCodez Sep 8, 2026
c5ddb3c
Reserve shared transfer points before hooks
BenCodez Sep 8, 2026
ca387d7
Release shared transfer hooks before callbacks
BenCodez Sep 8, 2026
dc25f95
Close shared point mutation consistency gaps
BenCodez Sep 8, 2026
520aa14
Journal shared vote shop purchases
BenCodez Sep 8, 2026
4d3f404
Recover shared transfers and bound journal names
BenCodez Sep 8, 2026
8d07e5a
Make shared MySQL purchases failure-safe
BenCodez Sep 8, 2026
0a4913e
Harden shared MySQL point completion and recovery
BenCodez Sep 8, 2026
58c5d0d
Close shared point settlement edge cases
BenCodez Sep 8, 2026
4928b10
Close shared point settlement edge cases
BenCodez Sep 8, 2026
bdd471b
Preserve shared point mutation state
BenCodez Sep 8, 2026
e1aa435
Merge remote-tracking branch 'origin/master' into security/pr-1600-local
BenCodez Sep 8, 2026
a52a1ec
Keep rejected transfer recovery off Bukkit
BenCodez Sep 8, 2026
6fe7db7
Reconcile caches after recovery refunds
BenCodez Sep 9, 2026
a2e0112
Avoid stale shared purchase cache writes
BenCodez Sep 9, 2026
1bfde24
Fix shared vote shop recovery races
BenCodez Sep 9, 2026
a58168c
Close shared vote shop recovery races
BenCodez Sep 9, 2026
cb73334
Bound shared point and purchase recovery work
BenCodez Sep 9, 2026
f3141f2
Wait for shared point reward persistence
BenCodez Sep 9, 2026
35f3ac2
Handle rejected shared point submissions
BenCodez Sep 9, 2026
e7fb241
Keep shared shop validation off GUI lanes
BenCodez Sep 9, 2026
b35abf4
Recover rejected shared point operations
BenCodez Sep 9, 2026
6b87b9f
Avoid blocking vote shop placeholder reads
BenCodez Sep 9, 2026
87de933
Fix shared vote shop recovery and cache refresh
BenCodez Sep 9, 2026
c687cbf
Handle rejected transfer settlement and cache races
BenCodez Sep 9, 2026
21ac3f9
Harden shared point settlement and callback recovery
BenCodez Sep 10, 2026
c94842e
Harden vote shop recovery paths
BenCodez Sep 10, 2026
e8e9316
Exclude optimistic points from cache dumps
BenCodez Sep 10, 2026
3c049f4
Align weekly reset generation with configured period
BenCodez Sep 10, 2026
367f941
Complete atomic point transfer safeguards
BenCodez Sep 10, 2026
96c8504
Harden shared MySQL purchase completion
BenCodez Sep 10, 2026
7ed6948
Await durable shared point rewards
BenCodez Sep 10, 2026
adcfa27
Make shared point rewards retry safe
BenCodez Sep 11, 2026
68976d5
Harden indeterminate shared point operations
BenCodez Sep 11, 2026
0647d07
Fence shared vote shop resets from cache dumps
BenCodez Sep 13, 2026
8bc2e1c
Fence all shared MySQL cache dumps
BenCodez Sep 13, 2026
36a5979
Document shared limit cache contract
BenCodez Sep 13, 2026
64a983b
Track epochs for every limited purchase
BenCodez Sep 13, 2026
03dd3fb
Version Vote Party configuration support
BenCodez Sep 13, 2026
d29b107
Harden replay recovery and mixed-version setup
BenCodez Sep 13, 2026
044bef3
Preserve mixed-version Vote Party settings
BenCodez Sep 13, 2026
17080c0
Harden shared point mutation recovery
BenCodez Sep 14, 2026
9d7a6c5
Make shared point mutations durably confirmable
BenCodez Sep 14, 2026
3304911
Use a stable vote shop reset zone
BenCodez Sep 14, 2026
3ac1341
Recover point journals across mode changes
BenCodez Sep 14, 2026
f192886
Harden shared point and shop recovery
BenCodez Sep 14, 2026
85e8cdf
Protect offline point cache clearing
BenCodez Sep 16, 2026
8818f29
Serialize optimistic cache clearing
BenCodez Sep 16, 2026
265d211
Avoid unnecessary cache monitor coupling
BenCodez Sep 16, 2026
5bae2bd
Retire completed admin point operations
BenCodez Sep 16, 2026
2e5e7d4
Release ambiguous unstarted point claims
BenCodez Sep 16, 2026
ec0574e
Dispatch vote shop purchases synchronously
BenCodez Sep 16, 2026
83470a2
Preserve authoritative bulk point validation
BenCodez Sep 16, 2026
6e4bebf
Preserve point replay safety across mode changes
BenCodez Sep 16, 2026
288dff8
Keep transfer player access on the entity lane
BenCodez Sep 16, 2026
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
12 changes: 10 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ automation because it copies a JAR into a developer-specific server directory.
Keep these paths separate:

- discovery/presence advertises current node identity and topology;
- configuration capabilities (`config.*.v1`) poll `/operations`, may read/preview/apply typed configuration, and journal
results;
- configuration capabilities (`config.*.v1` plus explicitly negotiated successors) poll `/operations`, may
read/preview/apply typed configuration, and journal results;
- inspection capability `data.inspect.v1` polls `/inspections`, executes only `ControlInspectionService`, and does not
journal because a lost acknowledgement can safely repeat a read. Repeated failures back this lane off exponentially
from one second to five minutes without changing voting or configuration availability.
Expand Down Expand Up @@ -160,6 +160,14 @@ limit:
Prefer one cohesive PR per repository for a paired feature, keeping its implementation, tests, and docs together. Split
further only when a part is independently deployable or has materially different review/rollback risk.

`config.proxy-method.v1` covers plugin messaging and Redis; `config.proxy-method.v2` adds HTTP. Dispatch and validate the
exact capability for the requested method. `config.quick-setup.v2` adds `VoteParty.Enabled`; keep legacy Vote Party
payloads on v1, preserve the installed Enabled value when they omit it, and reject the `enabled` field unless v2 was
accepted. The VotingPlugin connector may deploy first and
advertise these successors without using them until Control accepts them. A newer Control deployed first must leave its
v2-only actions unavailable on older nodes. Merge the VotingPlugin capability implementation before relying on the new
Control behavior in production.

Before pushing, run the focused tests, the full Maven build, and `git diff --check`. Do not commit server runtime data,
credentials, generated JARs, dependency caches, IDE output, or unrelated formatting.

Expand Down
6 changes: 6 additions & 0 deletions VotingPlugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,12 @@
<version>3.8.2-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.14.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,7 @@ public void onPostLoad() {
voteTester = new VoteTester(plugin);

loadVoteTimer();
getVotingPluginUserManager().startSharedPointTransferRecovery();

if (bungeeSettings.isUseBungeecoord()) {
loadBungeeHandler();
Expand Down Expand Up @@ -1539,6 +1540,9 @@ private void reloadPlugin(boolean userStorage, boolean reconcileHostedControl) {
updateAdvancedCoreHook();

reloadAdvancedCore(userStorage);
// PerServerPoints can switch shared point storage on during a live reload.
// Re-evaluate after storage has reloaded; UserManager keeps this lifecycle task unique.
getVotingPluginUserManager().startSharedPointTransferRecovery();

if (bungeeSettings.isUseBungeecoord()) {
BackendProxyHandler handler = getBackendProxyHandler();
Expand Down
Loading
Loading