minecraft-server/docs/SHOP-SYSTEM-DECISION.md

132 lines
8.1 KiB
Markdown

# Shop System Decision — racked.ru
**Date:** 2026-05-07
**Author:** s8n
**Status:** Decision — supersedes AUDIT-2026-05-07 F-11
**Inputs:** RESEARCH-SHOP-GUI.md (S1), RESEARCH-AUCTION-HOUSE.md (S2), RESEARCH-SHOP-AH-HYBRID.md (S3)
---
## 1. Problem statement
Three things land on the same hot spot:
- EZShop is bespoke, hardcoded 27-slot, drop+click-only, ugly title — YOU500 wants 54-slot polish.
- AuctionHouse 1.4.6 (Kiranhart) works, but ships ARR with no `LICENSE` file and a recurring dupe history.
- We want a single coherent marketplace experience under `/pm` (canonical exec), not a salad of mismatched plugins.
Three agents researched independently. They disagree on the shape of the answer:
| Agent | Recommendation | Core argument |
|---|---|---|
| S1 (shop GUI) | EconomyShopGUI free + keep AH separate | Best free-tier shop UX, drop-in replacement |
| S2 (auction house) | Keep Kiranhart short-term, swap to Nexus or Elaine Qheart | License + dupe risk; UX parity in the GPL fork |
| S3 (hybrid) | ExcellentShop unified, GPL-3 | One jar, one theme, one update path |
This doc reconciles them.
---
## 2. Stack candidates side-by-side
| Stack | Plugins | Shop license | AH license | Unified GUI? | Player shops? | Dependency surface |
|---|---|---|---|---|---|---|
| **A. ExcellentShop unified** | ExcellentShop + CoinsEngine (or Vault bridge) + NightCore | GPL-3 | GPL-3 | Shared theme, separate menus | Optional Chest module | NightCore framework jar |
| **B. EconomyShopGUI + NexusAuctionHouse** | EconomyShopGUI free + NexusAH | Proprietary free-tier | MIT | No (two themes) | No | Vault |
| **C. Genesis (BSP) + Elaine Qheart AH** | Genesis + AuctionHousePlugin | MIT | GPL | No | Genesis addon | Vault |
| **D. Status quo** | EZShop + AuctionHouse 1.4.6 | Bespoke (us) | ARR no LICENSE | No | No | Vault |
---
## 3. License + project-health matrix
| Stack | License fit (AGPL-leaning) | Active? | 1.21.x verified | Dupe / exploit history | FOSS-ethics score |
|---|---|---|---|---|---|
| A. ExcellentShop | GPL-3, sources self-buildable | Yes — push 2026-04-27 | 1.21.8+ Java 21 | Clean | 5/5 |
| B. EconomyShopGUI + Nexus | Proprietary free + MIT | Both active; Nexus quieter | 1.21.11 / 1.21.6 | Clean | 3/5 |
| C. Genesis + Elaine | MIT + GPL | Genesis active; Elaine open beta | 1.21.1 (Genesis untested 1.21.4+) | Clean | 5/5 |
| D. Status quo | Bespoke + ARR | EZShop dead-bespoke; Kiranhart active | 1.21.x | Recurring dupes (AntiDupe band-aid exists) | 1/5 |
ExcellentShop is the only stack where **both** halves are GPL-3, both are actively maintained by the same dev (NightExpress), and source is self-buildable so we never ship a paywalled binary. Everything else either splits the license story across two projects or carries one proprietary half.
---
## 4. Visual mockup — recommended `/pm` shop GUI
ExcellentShop's Virtual Shop module, themed and aliased. Title kept clean per YOU500 ask.
```
+------------------------------------------------------------+
| racked.ru / pm shop |
+------------------------------------------------------------+
| [BLK] [ORE] [FOO] [MOB] [RED] [DYE] [TLS] [MSC] | <- 8 categories
| |
| [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] |
| [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] | <- 36 item slots
| [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] | (4 rows x 9)
| [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] |
| |
| [<] [SELLALL] [/pm market] [BAL: 1,234] [>] | <- nav + AH jump
+------------------------------------------------------------+
```
54 slots total: 8 category icons (top), 36 items (4x9 grid), 9 footer (page nav, sellall shortcut, AH cross-link, balance, page indicator). Right-click any item = sell, left-click = buy. No donor stars, no rank-locked items in the default tier.
`/pm market` opens the shared-theme Auction House (ExcellentShop AH module) in the same skin, same fonts, same border palette — the polish unification S3 was after.
---
## 5. Recommendation — Stack A (ExcellentShop unified)
**Pick ExcellentShop + CoinsEngine.**
Why this beats S1's EconomyShopGUI:
- EconomyShopGUI's free tier is genuinely good for the *shop* but the auction module is paywalled. S1 was right that the shop is excellent; S1 was wrong to treat AH as out-of-scope, because we already need to swap Kiranhart (S2's finding). If we have to touch both anyway, replacing both with one GPL plugin beats replacing both with two unrelated plugins.
- "Free binary, closed source" is exactly the trap our philosophy memo (`project_racked_philosophy.md`) tells us to avoid when a real GPL alternative exists at parity.
Why this beats S2's Nexus / Elaine path:
- Nexus is BIN-only (no bidding). Players already use bidding on Kiranhart; removing it is a regression.
- Elaine Qheart's plugin is open beta with ~1k installs. The license is right, the maturity is not.
- ExcellentShop's AH module has BIN+bid+per-rank caps+tax — feature-parity with Kiranhart, GPL license, single-vendor support story.
S3 was directionally right. The fix vs S3 is mostly operational (alias commands under `/pm`, disable Chest module, build from source).
---
## 6. Migration cost
| Step | Effort | Risk |
|---|---|---|
| 1. Build ExcellentShop + CoinsEngine + NightCore from source on a builder pod | 1 evening | Low — `mvn package`, output jars |
| 2. Stage on dev container, replicate EZShop 8 categories into `virtual-shop/` YAML | 2-3 hours | Low — YAML, no schema gotchas |
| 3. Migrate AuctionHouse listings | **Cannot migrate active listings** — drain or expire current AH first; new AH starts empty | Medium — communicate to players |
| 4. Alias `/pm shop``/vshop`, `/pm market``/ah`, hide native cmds | 30 min via `commands.yml` | Low |
| 5. Disable Chest Shop module (we don't need it; QuickShop-Hikari is the future story) | 5 min config flag | None |
| 6. Smoke-test on staging: 54-slot layout, per-rank discount perms, sellall, AH listing+bid | Half day | Low |
| 7. Maintenance-window swap on live: stop server, drop EZShop+AuctionHouse jars, drop new jars, reload configs | 30 min downtime | Medium — see risk register |
| 8. Update `AUDIT-2026-05-07.md` F-11, update `/pm help`, post player notice | 1 hour | None |
**Total:** roughly one evening of build+stage + one half-day staging trial + one short maintenance window. No code changes to other plugins. AuthLimbo, chat plugin, LP prefixes — all untouched.
---
## 7. Risk register
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| ExcellentShop GPL build breaks on a future Paper API rev | Low | Medium | Pin a known-good tag; CI build on Forgejo runner |
| NightCore framework jar drift between ExcellentShop and CoinsEngine | Low | Medium | Lock both to the same release wave; smoke-test on each upgrade |
| Player backlash over draining current AH listings | Medium | Low | Two-week heads-up in `/pm news`; offer to refund stuck items manually |
| `/pm` alias collisions with existing chat plugin commands | Low | Low | Audit `/pm` namespace before swap; document in SYSTEM.md |
| ExcellentShop dev (NightExpress) goes dark | Low | High | Source is GPL-3 — we keep buildable copy; fall back to Stack C (Genesis + Elaine) only if needed |
| Per-rank discount permissions clash with LP prefixes-locked rule | Low | Low | Discount perms ride on rank perms, not prefix metadata — orthogonal to `feedback_lp_prefixes_locked.md` |
| YOU500-style player wants bidding back in identical Kiranhart UX | Medium | Low | ExcellentShop AH supports bid+BIN; theme tweaks deliver familiar feel |
| Build-from-source policy adds ops overhead | Certain | Low | Document in `nullstone-server/build-shop.md`; one-line `mvn package` script |
---
## 8. Decision
**Adopt Stack A — ExcellentShop unified, GPL-3, built from source.** Schedule the migration after the next AuthLimbo release window. Update audit F-11 to reference this doc. Keep S1's EconomyShopGUI and S2's Nexus / Elaine in the back pocket as fallbacks if ExcellentShop ever goes dark.