Files
spigot-stealth/design/user-stories/us-005-configure-and-persist-progression.md
T
dmg a084f86c1d
Release / release (push) Successful in 2m17s
CI / build (push) Successful in 1m3s
feat(admin): add persistent sleep-count policy
2026-09-05 08:34:50 -04:00

37 lines
2.4 KiB
Markdown

---
type: User Story
title: "US-005: Configure and persist stealth progression"
description: Give operators validated settings and durable, defensive storage for stealth behavior.
status: done
---
# US-005: Configure and persist stealth progression
As a **server operator**, I want stealth progression to be configurable and durable so that the plugin remains predictable across restarts and balance changes.
## Acceptance criteria
- [x] The qualifying-time threshold is configurable and defaults to eight hours.
- [x] Player-facing progress, unlock, prepared-login, and concealed-session messages are configurable.
- [x] Startup validates required settings before registering partially functional listeners, commands, or tasks.
- [x] Invalid required configuration prevents initialization and produces a clear server log message.
- [x] UUID-keyed state stores accumulated qualifying duration, unlock ownership, active qualifying timing data, prepared-login state, and any current concealment metadata needed for safe recovery.
- [x] Qualifying runtime intervals use a monotonic elapsed-time source so wall-clock adjustments cannot grant or remove progress.
- [x] Durable timestamps, when required, use RFC 3339 UTC notation.
- [x] State is saved periodically, after material state changes, and during orderly plugin disable.
- [x] State uses atomic replacement where supported so an interrupted write does not replace valid data with a partial file.
- [x] Corrupt, unknown, or invalid records cannot silently grant time, an unlock, a prepared login, or concealment.
- [x] Unknown forward-compatible fields are preserved where practical.
- [x] Persistence work does not perform blocking file operations on the server tick thread.
- [x] The sleep-count policy persists in `state.yml` and defaults safely to `exclude` when missing or invalid.
## Validation
Verified settings defaults and rejection, packaged configuration, safe UUID-state defaults, sleep-count policy defaults and round trips, RFC 3339 round trips, unknown-field preservation, invalid-record rejection, atomic repository writes, and dedicated-thread loading and saving with automated tests and `./gradlew clean check jar`.
## Related
- [Accumulate invisibility time and unlock stealth](us-001-accumulate-invisibility-and-unlock.md)
- [Rejoin without a visible identity](us-002-rejoin-without-visible-identity.md)
- [Inspect and manage player stealth](us-004-administer-player-stealth.md)