minecraft-server/CROSS-REFERENCE-2026-05-07.md

365 lines
22 KiB
Markdown
Raw Normal View History

<!--
Cross-reference survey for the 2026-05-07 racked.ru / YOU500 incident.
Read-only inventory of existing docs across local repo clones, written
to help the four parallel investigation outputs (backup hunt, AuthLimbo
audit, backup strategy, server audit) integrate without conflict.
Author: cross-reference agent (read-only)
Status: survey only — no fixes proposed here, that's the other agents' job.
-->
# Cross-Reference Survey — 2026-05-07
**Trigger:** racked.ru player **YOU500** void-died via AuthLimbo
`teleportAsync` failure, lost full inventory, no backups exist.
Four parallel agents are writing audit + plan docs. This doc maps
them onto existing infra so nothing collides or gets orphaned.
---
## 1. Per-repo state snapshot
### `auth-limbo` (Paper plugin source)
| Field | Value |
|---|---|
| Origin | `ssh://git@192.168.0.100:222/s8n-ru/auth-limbo.git` ⚠️ stale (`s8n-ru` rename) |
| Latest tag in CHANGELOG | **1.0.0** (2026-04-30) — single release |
| Last commit | `b686380 readme: restyle to match minecraft-launcher format` |
| Recent commits | README rewrites, AGPL switch, rename chain `RackedLimbo → LoginLimbo → AuthLimbo` |
| CI | `.github/workflows/build.yml` + `release.yml` (GitHub Actions, **not** `.forgejo/`) |
| Tests | **None.** `src/test/` does not exist. |
| Source | 5 Java files: `AuthLimbo`, `AuthMeDatabase`, `LimboWorldManager`, `LoginListener`, `VoidGenerator` |
| Docs | `docs/{compatibility,configuration,how-it-works,installation}.md` |
| CHANGELOG style | **Keep a Changelog + SemVer**, date-suffixed `## [1.0.0] - 2026-04-30` |
| License | AGPL-3.0-or-later, SPDX header in every Java file |
**Key existing detail relevant to the bug** — `LoginListener.java`
already implements the documented Paper #4085 fix (chunk-ticket pin
in `AuthMeAsyncPreLoginEvent` + `getChunkAtAsyncUrgently` chained
with `teleportAsync` at MONITOR priority on `LoginEvent`, with
configurable `authme.teleport-delay-ticks`). If YOU500 still
void-died, the bug is in **how** that chain handled a return-value
of `false` / a thrown exception — the current code only logs a
`warning` and lets the player stay wherever they were (which on
login is the limbo void). See `LoginListener.java:166-191`.
The AuthLimbo audit agent's findings should land as:
- **`docs/INCIDENT-2026-05-07-you500.md`** (new) — forensic root-cause
doc, follow `docs/REBRAND_2026-04-30.md` style (date-prefixed,
scope/apply/result/rollback sections — convention shown below).
- **`CHANGELOG.md`** — bump to `## [1.0.1] - 2026-05-07` with
`### Fixed` block, follow Keep-a-Changelog format.
- **`src/main/java/ru/authlimbo/LoginListener.java`** — code patch.
Likely changes: handle `success == false` and `exceptionally`
with a kick or retry rather than silent log; consider raising
default `teleport-delay-ticks` from 10 → 20.
- **`src/test/`** (new directory) — unit tests for the listener.
No precedent here, but pom.xml needs JUnit added.
---
### `minecraft-server` (server repo — this repo)
| Field | Value |
|---|---|
| Origin | `ssh://git@192.168.0.100:222/s8n-ru/minecraft-server.git` ⚠️ stale |
| Last commit | `ede6029 proantitab: allow lp/luckperms in global; deny essentials.motd default` |
| Top-level docs | `MISSION.md`, `README.md`, `RULES.md`, `THANKS.md`, `VIBE.md`, `TELEMETRY_AUDIT.md` |
| `docs/` | `BACKUP.md`, `DEPLOY.md`, `PERMISSIONS.md`, `PLUGINS.md`, `PLUGIN_ALTERNATIVES.md`, `RACKED_BRAND.md`, `REBRAND_2026-04-30.md`, `ROADMAP.md`, `migrations/lands-to-landclaim.md`, `plugins/<name>.md` (20 files) |
| Existing TODO | The README "Roadmap / TODO" section (lines 91-180) is the canonical living checklist. Tagged `[P0]` blocker / `[P1]` vision / `[P2]` improvement / `[P3]` nice-to-have. `docs/ROADMAP.md` is **scoped narrowly** to plugin-acquisition overhaul (Phases 1-3). |
| `live-server/` | live config snapshot (purpur.yml, server.properties, ops.json, plugins/) — **mirrors prod state**, not a build input. |
| Backup script | `scripts/backup.sh` — note **bug at line 119** (orphaned `"${BACKUP_PATH}/synapse-signing-key-${TIMESTAMP}.key"` block sits outside any `if`, will fail at runtime if signing-key path absent) |
| CI | `.github/workflows/` is empty. `.github/ISSUE_TEMPLATE/` empty. No `.forgejo/`. |
**No existing files named** `AUDIT*`, `INCIDENT*`, `RUNBOOK*`,
`TODO*`, `CHANGELOG*` at root or in `docs/`. The closest precedents:
- `docs/REBRAND_2026-04-30.md` — date-prefixed event log w/
Apply/Side incident/Rollback sections. **Use this as the format
template for any new INCIDENT-* doc.**
- `docs/migrations/lands-to-landclaim.md` — multi-section migration
plan (Current State / Target / Plan / Rollback). Format template
for future strategy docs.
- `MISSION.md` / `VIBE.md` / `RULES.md` — top-level "values" docs.
Don't add new top-level capitalised md files unless the doc is
similarly load-bearing for the project's identity. Detail goes in
`docs/`.
---
### `infra` (nullstone+cobblestone runbooks)
| Field | Value |
|---|---|
| Origin | `ssh://git@192.168.0.100:222/veilor-org/infra.git` ✅ org-scoped, no rename impact |
| Last commit | `381f923 runbook: distribute load + sync data (operator's HA vision)` |
| Layout | `forgejo/`, `runbooks/`, `repos/`, root `STATE.md` + `AUDIT-2026-05-05.md` |
| Runbooks | `COBBLESTONE-INTAKE.md`, `DE-DECISION-cobblestone.md`, **`HA-CLUSTER-distribute-and-sync.md`** (already covers MC backup placement!), `MIGRATION-nullstone-to-cobblestone.md` |
**Critical pre-existing context:**
- `STATE.md` already lists *"`/opt/docker/backup.sh` fixes —
matrix-postgres + rocketchat-mongodb + literal CHANGE_ME pw"* as
open issue (line 97), AND lists Restic+autorestic as the **#1**
recommended addition (lines 113, 283-285 of `AUDIT-2026-05-05.md`).
- `runbooks/HA-CLUSTER-distribute-and-sync.md` line 51 already plans
*"Backups (offsite) — Restic to B2/Wasabi nightly"* and line 72
pins MC to nullstone with *"World data ZFS-replicated for DR
only"*. The backup-strategy agent's plan must reconcile with this
— don't propose a parallel scheme; either extend the HA runbook or
cross-link it as the parent design.
- `AUDIT-2026-05-05.md` lines 200-203 already flag the backup script
as silently broken (RC + ex-Matrix not dumping). Confirms the
symptom that caused YOU500's loss.
**Format conventions in `infra/`:**
- Audit reports: `# 5-Agent Audit Report — YYYY-MM-DD` header,
TL;DR section, severity-ordered Action items section, file index.
- Runbooks: `# Runbook — <topic>` header, Goal blockquote, North-star
diagram if applicable, phase plan, failure scenarios + RTO table,
open decisions, related links.
- Dating: filenames always `<TYPE>-YYYY-MM-DD.md`.
---
### `minecraft-launcher`
| Field | Value |
|---|---|
| Origin | `ssh://git@192.168.0.100:222/s8n-ru/minecraft-launcher.git` ⚠️ stale |
| Last commit | `31d25f8 readme: shrink license section to single sub line` |
| Relevance to incident | None direct. Would only matter if the incident agent recommends a launcher-side patch (e.g. forced relog on void death detection) — unlikely. |
### `minecraft-client`
**Not a git repo** (`fatal: not a git repository`). No remote to
worry about. Excluded from any rewrite list.
### `veilor-os`
| Field | Value |
|---|---|
| Origin | `ssh://git@192.168.0.100:222/veilor-org/veilor-os.git` ✅ no rename impact |
| Relevance | None — separate brand (security distro), not Minecraft. Skipped per instructions. |
---
## 2. Stale `s8n-ru` origin URLs (per 2026-05-07 rename)
Per workspace memory `user_git_identity.md` the Forgejo user `s8n-ru`
was renamed to `s8n` on 2026-05-07. Forgejo serves a 307 redirect for
now but the canonical path is `s8n/<repo>`. The following local
clones still have the old origin:
| Repo (local clone) | Current origin | Should become |
|---|---|---|
| `_github/auth-limbo` | `ssh://git@192.168.0.100:222/s8n-ru/auth-limbo.git` | `ssh://git@192.168.0.100:222/s8n/auth-limbo.git` |
| `_github/minecraft-server` | `ssh://git@192.168.0.100:222/s8n-ru/minecraft-server.git` | `ssh://git@192.168.0.100:222/s8n/minecraft-server.git` |
| `_github/minecraft-launcher` | `ssh://git@192.168.0.100:222/s8n-ru/minecraft-launcher.git` | `ssh://git@192.168.0.100:222/s8n/minecraft-launcher.git` |
**No rename required for:** `_github/infra` (`veilor-org/`),
`_github/veilor-os` (`veilor-org/`), `_github/minecraft-client` (not
a repo).
Recommended one-shot fix (deferred — not part of these four agents):
```bash
for r in auth-limbo minecraft-server minecraft-launcher; do
cd /home/admin/ai-lab/_github/$r
git remote set-url origin ssh://git@192.168.0.100:222/s8n/$r.git
done
```
Also update the in-doc URL references:
- `auth-limbo/src/main/resources/plugin.yml` line 7: `website: https://github.com/s8n-ru/auth-limbo`
- `auth-limbo/src/main/java/ru/authlimbo/*.java` SPDX header: `Copyright (C) 2026 s8n-ru`
- `minecraft-server/VIBE.md` line 38: `github.com/s8n-ru/auth-limbo`
---
## 3. Overlap with session-noted TODO items
The session noted these TODOs that the four agents may want to fold
into recommendations. State as of HEAD:
| Item | Existing mention? | Where | Status |
|---|---|---|---|
| **SHA256 → BCRYPT** (AuthMe hashing) | ✅ flagged 2026-05-02 | `security/nullstone-server/2026-05-02-mc-audit.md` summary: *"AuthMe also uses unsalted SHA-256, no tempban, no captcha, and 5-char minimum passwords"* | **Not yet addressed in repo.** No TODO entry in README. New. |
| **EZShop drop** | ⚠️ Plugin loaded via `PLUGINS:` in `docker-compose.yml:51` | docker-compose.yml | No TODO entry yet. New. |
| **CapDrop** (Linux capabilities) | ❌ No mention | — | Net-new infra-side item (deploy.security level). Belongs in server-audit agent's report. |
| **tracking-range** | ❌ No mention | — | Net-new (purpur.yml tuning). New. |
| **CO DB → MySQL** (CoreProtect) | ❌ No mention | — | Net-new. Touches plugin policy (CoreProtect-CE is the one acknowledged license exception per MISSION.md — CO config change OK, plugin swap not). |
| **TPS webhook** | ⚠️ "Prometheus exporter + Grafana" entry exists in README:105 (P2). Webhook would be lighter-weight alternative. | README.md:105 | Adjacent to existing TODO; consider replacing or augmenting it. |
| **spark baseline** | ✅ spark already loaded in `PLUGINS:` (compose:54) and listed in VIBE.md:78 | docker-compose.yml, VIBE.md | "Baseline" = capture a profiling run for ref. Net-new. |
| **plugin folder cleanup** | ⚠️ `live-server/plugins/` is checked-in live config snapshot. Past cleanup happened in REBRAND_2026-04-30 (Side incident — disk full). | docs/REBRAND_2026-04-30.md:65-74 | Operational, not docs. Net-new. |
**None of the eight overlap with the existing `docs/ROADMAP.md`**
(which is scoped narrowly to *plugin-acquisition* — manifest +
lockfile + CI). They all belong in the **README.md "Roadmap / TODO"
checklist** by current convention. The server-audit agent should
append them there, not create a new ROADMAP-* doc.
---
## 4. Existing backup-related mentions
| File | Line | Content |
|---|---|---|
| `docs/BACKUP.md` | all | Documents the daily 02:00 cron + retention. **Critical drift:** describes worlds being backed up but VIBE.md:54-58 says *"no world backups"*. Direct contradiction. |
| `scripts/backup.sh` | 80-117 | Minecraft block: docker-exec tar of world/world_nether/world_the_end + configs. **Real, working code.** |
| `scripts/backup.sh` | 119-122 | **Orphaned dead-code block** outside any `if` (dangling from `synapse-signing-key`). Will trigger script failure if signing-key path missing. |
| `README.md` | 23, 45, 164, 179 | Mentions backup feature. README:179 records "freed 11G+ (old backups, ...)". |
| `VIBE.md` | 54-58 | *"Daily configs, no world backups (it'd eat too much disk). If you lose a base to grief, that's the game."***conflicts with reality.** |
| `docs/REBRAND_2026-04-30.md` | 53, 65-74 | Records 2026-04-30 backup tarball and 2026-05-01 disk-full incident from accumulated backups. Confirms backups *were* running. |
| `SYSTEM.md` | 737-749 | Workspace-level system reference says backups run daily, ~5-7GB compressed. Out-of-date plugin counts (says 25, actual ~16) and Purpur version (says 1.21.10, actual 1.21.11). |
**Major contradiction the backup-strategy agent must resolve:**
either VIBE.md must drop the *"no world backups"* line (recommended
— reality is that worlds **are** being backed up), or the operator
must accept that the YOU500 loss happened because the worlds were
**logically excluded from the policy** even though they were
mechanically being archived. The latter is unlikely — daily 02:00
tarball would have caught a 2026-05-07 daytime void death.
**Backup-hunt agent finding to verify:** does `/opt/backups/` on
nullstone actually contain any usable `mc-world-backup-*.tar.gz`
files? `STATE.md` line 97 + `AUDIT-2026-05-05.md` lines 200-203
suggest the script *runs* but its other arms are failing silently;
the MC arm at lines 80-117 of backup.sh has no obvious bug, so
backups should exist. If they don't, that's the deepest finding.
---
## 5. Forgejo runner / CI integration
Per memory `project_forgejo_nullstone.md` and `STATE.md` line 26-27,
nullstone runs a Forgejo runner with labels
`ubuntu-24.04 + nullstone`. **No repo currently has a `.forgejo/`
directory** — neither auth-limbo nor minecraft-server nor infra. CI
in `auth-limbo` is GitHub Actions (`.github/workflows/`).
`STATE.md` line 121-129 notes the v0.5.32 veilor-os ship is pending
on flipping `runs-on:` to `nullstone` to use the Forgejo runner.
**Implication for the audit agents:** if the AuthLimbo agent wants
the fix to land via CI, two options:
1. Keep `.github/workflows/build.yml`, since GH-mirror is now
manual-only post-2026-05-06 (`STATE.md`:14-18) — workflow won't
trigger automatically anymore, would need manual mirror push.
2. Migrate to `.forgejo/workflows/build.yml` with
`runs-on: ubuntu-24.04` (compatible with the runner). Cleaner,
matches new direction. **Recommended.**
Either path: pre-existing dependency on `AUTHME_JAR_URL` repo secret
(see `.github/workflows/build.yml:21-26`) needs to be re-added on
Forgejo if path 2 is taken.
---
## 6. Workspace-level `SYSTEM.md` updates needed after backup-strategy lands
`/home/admin/ai-lab/SYSTEM.md` lines 665-779 has the canonical
workspace-level Minecraft section. After the backup-strategy doc
lands, the following blocks need editing (one PR, one paragraph
each):
| SYSTEM.md location | Existing content | Drift |
|---|---|---|
| Line 677 | "Minecraft Version: 1.21.10 (Purpur build 2532)" | Actual: 1.21.11 (compose line 10) |
| Line 686-690 | "25 plugins loaded ... bulk-updated 2026-04-17" | Plugin set has shifted heavily since (LandClaimPlugin → Homestead, WorldEdit → FAWE, Vault → VaultUnlocked, LoginSecurity → AuthMe, AuthLimbo added, EZShop+AuctionHouse added). Real count ≈ 16. |
| Line 692-706 | RAM 7GB idle, Purpur 1.21.10-2535, startup 47s | Out of date; would-be benefit re-measure as part of "spark baseline" TODO. |
| Line 765-771 | "Known Issues" block | Add YOU500 incident closure note (post-fix), F10 RCON wildcard already promised in Wave 2. |
| Line 776 | "Backup frequency: Add 6-hourly world snapshots for active play sessions" | This is the existing wishlist item the backup-strategy agent will likely satisfy. Strike or replace with "Done — see infra/runbooks/MC-BACKUP-2026-05-07.md" (or wherever the strategy lands). |
**Per `CLAUDE.md` workspace rules**, technical detail belongs in
SYSTEM.md, not README.md. The README device-table line for
nullstone won't change.
---
## 7. Integration recommendations — where each parallel agent's doc lands
| Agent | Output should land at | Rationale |
|---|---|---|
| **Backup hunt** (find existing backups) | `_github/minecraft-server/docs/INCIDENT-2026-05-07-you500-backup-hunt.md` | Date-prefixed, follows REBRAND_2026-04-30.md format. Forensic in nature → minecraft-server `docs/`. |
| **AuthLimbo audit** (root-cause + code patch) | (1) `_github/auth-limbo/docs/INCIDENT-2026-05-07-teleportasync-failure.md` for forensic write-up; (2) source patch + `CHANGELOG.md` bump in same repo; (3) optional cross-link from `minecraft-server/docs/INCIDENT-2026-05-07-you500-backup-hunt.md` | Plugin source repo owns plugin bugs. INCIDENT- naming convention matches REBRAND_*.md. |
| **Backup strategy** (forward-looking design) | `_github/infra/runbooks/MC-BACKUP-strategy-2026-05-07.md` (or extend `HA-CLUSTER-distribute-and-sync.md` with a Phase 1.5 sub-section) | infra owns nullstone-side cron + restic. Cross-link from `minecraft-server/docs/BACKUP.md` (replace its current contents with a thin pointer). |
| **Server audit** (broader hardening — CapDrop, plugin folder, MySQL, etc) | `_github/minecraft-server/docs/AUDIT-2026-05-07.md` (synthesis), then **append individual TODOs to README.md "Roadmap / TODO"** | Matches `infra/AUDIT-2026-05-05.md` precedent. README is the canonical TODO surface for this repo per existing convention. |
**Files needing edits AFTER all four agents finish:**
| File | Change |
|---|---|
| `_github/minecraft-server/README.md` | Append new TODO entries from server-audit agent: SHA256→BCRYPT, EZShop drop, CapDrop, tracking-range, CO MySQL, TPS webhook, spark baseline, plugin folder cleanup. Add `[x]` for the YOU500 incident under "Done" once fix shipped. |
| `_github/minecraft-server/docs/BACKUP.md` | Rewrite to point to infra runbook; current Schedule/Strategy/Manual sections move to infra. Or replace contents with thin "see infra/runbooks/MC-BACKUP-strategy-2026-05-07.md". |
| `_github/minecraft-server/VIBE.md` | Drop or revise lines 54-58 — *"no world backups"* contradicts reality and is the philosophical claim that may have justified treating backups as low-priority. Important narrative fix. |
| `_github/minecraft-server/scripts/backup.sh` | Fix orphaned line 119-122 dead-code block. Independent of strategy agent's output. |
| `_github/minecraft-server/docker-compose.yml` | If EZShop drop accepted: remove line 51. (Server-audit agent decision.) |
| `_github/auth-limbo/CHANGELOG.md` | New `## [1.0.1] - 2026-05-07` entry. |
| `_github/auth-limbo/pom.xml` | Version bump 1.0.0 → 1.0.1 if patch shipped. |
| `_github/auth-limbo/src/main/java/ru/authlimbo/LoginListener.java` | Code fix per AuthLimbo agent. |
| `_github/infra/STATE.md` | Add 2026-05-07 changelog entry referencing the incident; check off "/opt/docker/backup.sh fixes" pending decision (line 97) when backup script repaired. |
| `_github/infra/AUDIT-2026-05-05.md` | Append addendum or leave dated; the new audit replaces/augments the F-numbered findings related to MC backups. |
| `/home/admin/ai-lab/SYSTEM.md` | Update Minecraft section per §6 above. Add note in Known Issues (line 765). Update Last Updated. |
| `/home/admin/ai-lab/README.md` | "Last Updated" stamp; one-line status mention if user wants it surfaced at workspace level. |
---
## 8. Open conflicts and duplications
1. **VIBE.md vs reality** (most important narrative conflict). VIBE
says no world backups; backup.sh + BACKUP.md + REBRAND_2026-04-30
prove worlds **are** archived nightly. The YOU500 inventory loss
means either (a) backups didn't run that day, (b) backup ran but
the rollback isn't operationally feasible (would lose other
players' progress between 02:00 and the death), or (c) operator
chose not to rollback. **The backup-strategy agent must address
this explicitly** rather than just propose a new scheme.
2. **`docs/ROADMAP.md` scope vs README "Roadmap / TODO"** — the
docs file is narrowly about plugin-acquisition Phases 1-3, while
the README has the all-up living checklist. Future agents should
not put generic TODO items into `docs/ROADMAP.md`. Keep its scope
tight or rename it `docs/PLUGIN-ACQUISITION-ROADMAP.md`.
3. **infra `HA-CLUSTER-distribute-and-sync.md` vs new MC-backup
strategy** — there's a real risk the backup-strategy agent
designs Restic-to-B2 in isolation while HA-CLUSTER already plans
that exact service for both nullstone+cobblestone. Strategy doc
must reference and extend the HA-CLUSTER plan (specifically the
"Backups (offsite)" row in its layer table, line 51).
4. **CoreProtect MySQL migration** — proposed in session TODOs.
`MISSION.md:24` codifies CoreProtect-CE as "the one acknowledged
license exception". Switching its DB backend to MySQL is fine
under that policy (config, not plugin swap), but the server-audit
agent should explicitly note "this is a config change, not a
plugin swap, so MISSION.md:24 still holds" so the policy isn't
accidentally diluted.
5. **AuthLimbo CI host**`.github/workflows/` lives in repo but
GH push-mirror is off as of 2026-05-06. Builds will only run if
someone manually pushes to GH. Worth flagging to the AuthLimbo
agent that any CI step they propose may need a `.forgejo/`
variant, otherwise the patched 1.0.1 release won't auto-build.
6. **`_github/minecraft-client` is not a git repo** — nothing to
worry about for this incident, but anyone iterating on the
incident later may try to commit something there expecting it to
work. Worth recording.
---
## 9. Summary table — convention by repo
| Repo | Audit doc convention | Incident doc convention | TODO surface | CHANGELOG style |
|---|---|---|---|---|
| `auth-limbo` | (none yet) | (none yet — recommend `docs/INCIDENT-YYYY-MM-DD-<slug>.md`) | (none — small repo) | Keep a Changelog + SemVer, `## [X.Y.Z] - YYYY-MM-DD` |
| `minecraft-server` | (none yet — recommend `docs/AUDIT-YYYY-MM-DD.md` matching infra style) | follow `docs/REBRAND_2026-04-30.md` template | README "Roadmap / TODO" with `[P0..P3]` tags | (none — uses git log) |
| `infra` | `AUDIT-YYYY-MM-DD.md` at root | (use runbooks for forward-looking; no incident files yet) | `STATE.md` "Pending decisions" table | (none — uses git log + STATE.md) |
| `minecraft-launcher` | n/a | n/a | (none) | (none) |
| `veilor-os` | (separate brand — out of scope) | — | — | — |
---
*End of survey. Read-only. No files modified. No commits pushed.*