Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
RunicVelocity
Bounded startup diagnostics and an integrity-checked, change-aware local plugin manifest cache.
By Chazman
CHANGELOG
Changelog
1.0.0
- Made
Enabled = falsestartup-inert: no timeline or scan worker is created. - Replaced the cache string reader with a strict bounded UTF-8 decoder that rejects oversized, truncated, invalid, and noncanonical length encodings before string allocation; schema is now 2.
- Made cache identity case-sensitive off Windows and case-insensitive on Windows.
- Hashes and parses metadata from the same open file stream, with cancellation gates through enumeration, metadata traversal, and atomic cache publication.
- Renamed the cached timestamp to the honest
LastManifestScanUtcTicksand made diagnostic states distinguish fresh, warm, mixed, metadata-partial, bounded-partial, and cache-write-failed results. - Removed the Core registry/capability/service facade and made BepInExPack Valheim the only runtime dependency.
0.1.0
-
Made bounded hashing enforce the exact pre-admitted file length through one reusable 128 KiB buffer; early EOF, growth, or concurrent replacement now rejects the entry before cache publish.
-
Replaced the cache reader's size-check-plus-
ReadAllBytesrace with an exact-length bounded read and final size/timestamp proof. -
Added a bounded local startup timeline.
-
Added background, change-aware SHA-256/plugin-metadata manifest generation.
-
Added a canonical 8 MiB cache with precise path/size/time invalidation and atomic publication.
-
Added fail-closed caps for directory count, DLL count, file size, paths, fields, and dependencies.
-
Documented the normal-plugin measurement boundary and deferred preloader/Safe Start work honestly.
-
Hard-capped total admitted DLL bytes at 4 GiB, re-proved file evidence after metadata parsing, and made oversized identities/dependency sets fail closed instead of silently truncating them.