v1.4.0
2026-09-18
Minor release
- › macOS x86_64 now ships in the standard package. Windows x64, Linux x64 (glibc 2.34+) and macOS 13+ are all built, tested and published from the same source each release; macOS was built on request before this. The macOS build is x86_64 only — there is no arm64 slice, so Apple Silicon is supported through an x86_64 (Rosetta) toolchain rather than natively. The hardware fingerprint on macOS reads IOKit for the platform UUID and enumerates every
en*interface for the MAC component. - › Structured error codes. Every result now carries a
LicenseErrorCodealongside the status, so calling code can branch on which failure occurred instead of matching English message text. Codes are grouped into reserved numeric blocks and the names are the stable contract — persist the name, not the number. The catalog is documented in Customer_API_Reference §5.9 and §4.5, and a test now enforces that every code in the catalog appears in that table. - › Licence Inspector:
rg_inspectcollects a redacted diagnostic report from a customer machine — licence state, clock anchors, fingerprint components, integrity status — and encrypts it to your support key.rg_report_read(vendor-only) opens it and names a probable root cause. Redaction is enforced by tests: MAC addresses and licence signatures are masked, never echoed. The collector ships as source so you can rebuild it with your own key. - › Opt-in runtime code-integrity self-check. A trust-on-first-use hash of the licence-validation code in memory, so a patched-out check is detectable at runtime rather than only at load. Off by default.
- › Opt-in obfuscated build of the licence decision paths, compiled through an obfuscating Clang toolchain. Off by default and not used in the published binaries — every shipped zip this release is a plain build, and the manifest in the archive records that per artifact.
- › The load-bearing licence pattern ships as a supported toolchain rather than a documented idea:
rg_bind_assetseals a feature’s data under a key wrapped into the licence,rockyguard_bind_asset()wires it into your CMake, andrg_bind_lintchecks you have not left the plaintext behind. A feature protected this way does not work when the licence check is removed, because the data is not there to use. - › ABI note:
LicenseResultgained three members, appended at the end, so the struct changed size. Nothing was inserted or reordered and no existing field moved, but consumers must recompile rather than drop the new shared library beside an old executable. - › Rollback note: upgrading from v1.3.0 is automatic and needs no action. Rolling back from v1.4.0 to v1.3.0 does not work without deleting the anchor and counter state first. v1.3.1 changed the state HMAC salt and was never released publicly, so for anyone coming from v1.3.0 that change arrives with v1.4.0; v1.4.0 reads both formats but v1.3.0 reads only the old one and reports the newer state as “System clock manipulation detected”. The clock is not the problem — v1.3.0 maps every failed anchor check to that one message. Customer_Documentation §10.4 lists the paths to clear.
- › Test suite: 321 on Windows, 319 on Linux, run as a gate on every release build.