- Client:
--set-clockrequires-k/--pub-key; keyless queries warn - Server: refuses to start without
--seed; all-zero test seed requires--insecure-zero-seed - Server: truncated (oversized) datagrams are dropped
- Server: private-use protocol versions (0xc0000000-0xffffffff) are not negotiated or answered (RFC 12.2)
- Keys: seed values are never logged
- Reporting server: reports are verified before storage; storage capped, submissions rate-limited, request bodies size-limited
- Client: saturating arithmetic applied to MIDP/RADI
- Client: unrepresentable midpoints display as raw values
- Client: receive buffers sized to
MAX_RESPONSE_SIZE - Client: bracketed IPv6 literals parse in server lists; UDP datagrams
only sent to UDP addresses; zero values for
-n,-u,-rrejected - Client: malfeasance reports carry the full measurement chain and use
application/roughtime-malfeasance+json - Client: duplicated or stale datagrams no longer abort a measurement
- Keys: cloud backends return errors instead of panicking; seed-load failures exit the server cleanly
- Keys:
try_choose_backendreturns errors for unavailable backends; PKCS#11 backend selectable via--seed-backend pkcs11 - Keys:
generate --key seed://...no longer panics;storeoutput is usable as a--seedvalue - Server:
--interfaceaccepts only IP addresses - Server: metrics rates computed from per-interval deltas
- Server:
Response::to_wirebounds check accounts for frame overhead - Server: non-WouldBlock receive errors are counted and don't busy-spin
- Server: a worker thread dying shuts the server down with an error
- Reporting server: first report entries carrying
randare accepted (RFC 8.4.1) - Protocol:
UnexpectedMagicerror shows the correct 'ROUGHTIM' constant
SeedBackendrequiresSend; hand-writtenunsafe impl Send/Syncon the server'sKeySourcedeleted- CLI
--versionderives from the crate version - Reporting server: new
--listen <ADDR:PORT>option (default0.0.0.0:3000); storage documented as in-memory roughenough-integration-testandroughenough-reporting-serverarepublish = false- Dead code removed: unreachable non-Linux
stub_backendin Linux KRS
- Server: batched sends use one
sendmmsgsyscall on Linux (median batch send time down 8-10% at batch sizes 16-64); server crate moves from#![forbid(unsafe_code)]to#![deny(unsafe_code)]with one exception - Server: per-version response templates persist across batches (~1% at batch 64)
- Protocol:
Requestdrops the ZZZZ padding array (1064 -> ~110 bytes);PendingRequeststores only the nonce (batch 64 median 87.0 -> 85.5 us) - Server:
MerkleTree::reserverounds capacity to a power of two; receive buffer reused; metrics snapshots allocation-free - Client: response validation slices signed regions in place, removing four heap copies per response
- Protocol:
fixed_tag!macro generates fixed-size tag boilerplate;SrvCommitmentandSignatureareCopy - Protocol:
RequestedVersions/SupportedVersionsalias oneVersionListtype - Protocol:
DELE_PREFIX/SREP_PREFIXconstants replace per-version accessors - Merkle:
root_from_pathsis a free function - Server: library modules are
#[doc(hidden)]
- Fuzzing:
fuzz_response_parsetarget; fuzz targets build in CI; dependabot coversfuzz/ - Adversarial response-parsing tests; tests for untested tag modules
- Integration tests cover the framed path and multi-request batches
- Unit tests for the client's
sequence,transport, andclientmodules
- README quick start corrected (port, package names, seed, client flags)
- RELEASE-CHECKLIST package names fixed; publishable crates enumerated
- CONTRIBUTING unsafe-code policy matches reality
MAX_VERSIONScap documented as an RFC 5.1.1 deviation; UDP-only transport noted;doc/REQUEST-FLOW.mdupdated- Dockerfile dependency-cache layer fixed
- Initial release of Roughenough 2.0
This project aspirationally follows Semantic Versioning and tries to adhere to it as closely/practically as possible:
- MAJOR version increments indicate incompatible API changes
- MINOR version increments add functionality in a backward compatible manner
- PATCH version increments make backward compatible bug fixes
Given a version number MAJOR.MINOR.PATCH:
- Breaking changes to public APIs or protocol implementation increment MAJOR
- New features that maintain backward compatibility increment MINOR
- Bug fixes and internal improvements increment PATCH