A typo in a streak day number (missing, misspelled, not a whole number, or a numbering gap) makes a blocked placeholder day, never a shorter path: that day cannot be claimed until the file is fixed (the console names it on every reload). A day number above 366 is skipped.
A requirement segment must be exactly one comparison of two whole operands: a quote has to wrap a whole side and a lone & or | is rejected. A rejected expression counts as never met.
The streak clock is pinned at the first streak claim (or the first /rewards setstreak) in streak-clock.txt. Until then streak.timezone and streak.reset-time can be edited freely. Once pinned, a later edit is ignored with a console WARN until you delete that file and reload.
A registered command that fails (bad usage, no permission) still consumes the claim and prints "claimed", because SnLib's action engine ignores the dispatch result. SnRewards warns once, before the actions run, about a command that is not registered. /rewards reset clears a claim by hand.
A claim whose database write committed in the few milliseconds before a server stop is spent without its actions. The console names the player and the reward or day; /rewards reset or /rewards setstreak fixes it.
A streak day whose gate is invalid keeps its place but cannot be claimed until the file is fixed (the menu answers streak.locked on click).
A requirement over the plugin's own placeholders sees a snapshot up to about a second old. An unresolved placeholder on a side the check evaluates makes the requirement not met, and || and && stop at the first side that decides.
A quit inside the one-database-round-trip window of a streak claim rolls the day back; with grace 0 and no return that logical day, the streak reads as lost (/rewards setstreak restores it).
A database.type typo falls back to SQLite (SnLib behavior).
The plugin has not been booted on a server yet: runtime behavior is verified by reading and 78 unit tests only. The obfuscated jar is pending runtime confirmation.
Changes
First stable release: configurable rank rewards menu and a daily streak menu, claim committed in the database before its actions run, PlaceholderAPI expansion, join notifications and admin commands.
Final audit gate passed: 7 criticals verified fixed (3 contained), 3 accepted, 6 upstream, close pass with 0 new criticals.