# scradle 2026.09.25

Package version: 0.1.0
Since: first dated release

- build every package in parallel in containers (f2ed7fd)
- publish releases to the CDN under date tags, add one-line installer (43b5d2b)
- ask for four hours on every heavy job (03d6311)
- let the harness timeout be the one that fires (793a987)
- throttle at a ceiling the medium cannot beat (f86196e)
- resume and verify the arm64 kernel tarball (953ab69)
- cut on the workload, not on a stopwatch (e9c9efb)
- size the guest timeouts off a measurement (341214f)
- cut power when the stall is hit, not after ten seconds (1bbb97e)
- name the real cause when a ckpt cut lands early (9e3ea50)
- stop sizing matrix parallelism from nproc (5b1d000)
- give the two marginal matrix jobs three hours (140b3f6)
- size matrix parallelism from cores and memory (b8080b5)
- refuse el7 without its container, and time each kernel (a4edd2e)
- give the matrix jobs the time they need (88a6d89)
- stop ext4 lazyinit writing inside the canary window (0a527f4)
- drop unpacked kernel trees after the job (56ae2b2)
- back the 16 tib disk with qcow2, not a raw file (04e73d1)
- run the kernels jobs in the prebuilt toolchain image (b29e914)
- treat rpm2cpio sigpipe as a finished unpack (2456179)
- set accel in the shell and split the caches (190a13f)
- derive the image registry instead of trusting an empty var (f61e575)
- record the runner clock fix and keep the guard (2329bfd)
- fail apt on the main archive, warn on security (9922ebd)
- never build a kernel that names another toolchain (521deef)
- install libelf so objtool can run in ci (387fc3a)
- fall back when the archive built no amd64 (8986933)
- install libc.a on el9 and scope the rollback dev (addaac1)
- move the ca-store fix into a tested script (155dbf4)
- survive the runners' read-only ca store (7fffc8a)
- match the runners' plaintext dind transport (1f63921)
- adopt toolcompose, registry mirror and scanners in ci (2a4b461)
- build the self-extracting installer in its own job (5c1ea96)
- let dkms build the rollback variant (44cdb15)
- cover persistent reopen and rollback at boot (944d2fa)
- cover the new features in the fs-crash suite (ba000e3)
- restore the contributor sections the rewrite dropped (5212c1c)
- Tidy, cleanup, update, and explanation (50a60c9)
- cache the feature probes between runs (efeaae8)
- record what rollback and compression do not promise (8abc0df)
- revert a device to its snapshot, behind a build option (56d8e1e)
- compress preserved chunks in the COW store (fb3e828)
- stop reporting an on-device store that was refused (b752b08)
- make the overlay's torn-write path reachable from the suite (f5d6082)
- add writable snapshots backed by a write overlay (5c76b50)
- persist the COW store across a clean release (d1e5d60)
- fix the unprobed freeze fallback below 5.11 (8896277)
- freeze and thaw the filesystem inside snap create (46a4228)
- add a free-space map that skips COW and reports holes (f7edea6)
- port the merged-in features below 5.12 (09d0dc6)
- docs: the crash suite is 30 of 30 as well (0b2134f)
- docs: 30 of 30, on one tree (530acd9)
- docs: the detach panic is fixed, and what it cost (250faf6)
- never unhook a request-based disk (294d68b)
- record the detach panic on request-based disks (96d0101)
- stop racing the driver core's class glue directory (f5bffba)
- docs: RHEL 8 is booted, and document the store poll (a1e8d35)
- boot RHEL 8, and make the RPM path take more than one distro (b376178)
- notice a dead COW store while somebody is still listening (a60d804)
- prune matrix disk images instead of holding them in RAM (636c5ee)
- print counters through one helper, and choose the toolchain per kernel (c0745f0)
- docs: the digest map's cost is arithmetic now, and el7 is claimed (9997215)
- docs, packaging: the floor is 3.10 and it was booted (c8ebf1e)
- provision the el7 kernel instead of hand-unpacking it (4b3241e)
- boot CentOS 7, and split reads the old block layer will not (2a87d59)
- compile against RHEL 7's 3.10, and refuse to guess a signature (d980629)
- own the digest map instead of borrowing one (4b4e5e2)
- Attempt RHEL 7 / 3.10, keep what it proved, ship none of it (771f9e1)
- docs: re-measure 5.9, 5.10 and 5.12 after the EAGAIN fix (7d61293)
- docs: 4.20 and 5.4 are green, and the two red rows are skips that say why (ce86d56)
- tests: a precondition the environment cannot meet is a skip, not a failure (64d84a5)
- docs, packaging: the floor is 4.20 and there are two strategies (5611fda)
- Reach 4.20: static_assert, xa_for_each arity, and the old archive layout (2b76bb0)
- stop answering EAGAIN to a condition that never clears (55552a2)
- Second interposition strategy: make_request_fn for 4.20 through 5.8 (a2fd642)
- Lower the supported kernel floor from 5.12 to 5.9 (f5fc0d2)
- stop answering EAGAIN to a condition that never clears (1c90ffc)
- exclusions, throttling, extents, holes, tracepoints, boot hooks (1a3a484)
- one instant across volumes, and stop caching pre-gate reads (8352ccc)
- stop refusing a store by destroying the file first (0de01a0)
- fail the disk, corrupt the records, abuse the ioctls (de6bd9e)
- cover ext3, ext4, lvm, dm-crypt and a root partition (36c89c1)
- run the new suites in ci, and document them (b246e50)
- boot a snapshot as the root filesystem (ded62ce)
- snapshot btrfs, f2fs, ext2, vfat and exfat (e66eec8)
- attach before the mount, and unbreak xfs (fb93aaf)
- cover the crash gaps, and find a real one (755b06e)
- say whether we are writing to the protected device (e86f405)
- document backing up a root volume (d13d04c)
- align the on-device state image to a sector (f7e9503)
- put the state file on the traced device too (8c98457)
- let the log live on the traced device (f603504)
- pull the raw-extent file handling out of cow (a33e1ed)
- drop the last em dashes outside results (d2e83c8)
- record what the 22-kernel matrix actually did (ef25aea)
- stop the verify tests failing below 6.6 (05ac9f9)
- bring the docs up to what the code does (20791f6)
- snapshot the live root, and prove it is the root (87bbc0c)
- let the library see a corrupting store (e4e5e7b)
- expose the log to scradlectl, the library and python (a683b67)
- prove the log against a real power cut (de4095a)
- close the checkpoint window and expose the log (0d40b3f)
- correct crash-cbt against what was actually built (73d4692)
- correct the docs the write-intent log invalidated (8a6253d)
- wire up the write-intent log (03b3f59)
- split licensing: gpl-2 kernel, agpl-3 userspace (10ba891)
- add the write-intent log, not yet wired up (b8f99b7)
- run the qemu suites without a kvm runner (35866c6)
- drop the dattobd patch and its writeups (2953f03)
- add the pipeline badge and the real repo url (cd53b3a)
- point the license badge at something real (ada152d)
- document the pipeline and the commit style (c309bcf)
- checksum the cow store and verify it on read (34a52e5)
- build the kernel matrix in containers (88410bc)
- test every supported kernel, fix what it found (52693ee)
- fix the four recorded persistent-cbt defects (908e503)
- drop the last stale claims and product names (74e2b3c)
- rewrite persistent cbt and integration docs (7f721f9)
- rewrite architecture and observability (13fc189)
- rewrite differential testing and findings (46188d6)
- rewrite the testing doc (639a093)
- rewrite the user guide and kernel support (da8c0be)
- make the top-level docs stand alone (7ce695c)
- fix two comments that describe wrong behaviour (39ad375)
- add runnable examples, verified in the vm (cb698af)
- build arm64 in ci (a2b7b84)
- skip device classes when modules are missing (680fa17)
- stop the rootfs deleting its own headers (799b893)
- add nbd and a clean results serial port (8973ce5)
- declare every test disk explicitly (0e8fdbc)
- cross-compile for arm64 (89e319e)
- report the queue bound on a detached slot (ab46284)
- ask the module how many slots it has (44c9c81)
- add stable udev names for snapshots (ae8a10d)
- expose per-device state in sysfs (2a59e10)
- make the tunables changeable without a rebuild (732cf77)
- give the dev vm python headers (ee4349a)
- test md, zram and 4kn device classes (67682d2)
- fail on a lost result line instead of hiding it (24d8462)
- drop an unused arg from on-device open (4e1c562)
- name the trade the on-device store makes (547bd5a)
- test the on-device store and its refusals (1e049f0)
- add an opt-in store on the traced device (86e9897)
- update the overview status section (636018a)
- point the index at the new capability (ed8a233)
- say what a failed attach does to loaded state (8e48534)
- describe the crash pair, refresh counts (e05b5cb)
- document what reboot persistence misses (69978f4)
- prove a power cut refuses the saved state (041445c)
- persist the change list across a clean stop (b8be97c)
- refresh the assertion counts (852be28)
- log an expansion once, not per worker (2cfc026)
- document the ceiling and floor semantics (cd365f6)
- prove the store grows and fails closed (7ac5996)
- show expansion limits and failures in status (ed84bb5)
- export driver state as /proc/scradle-info (b8d855e)
- grow the cow store on demand (6b978e6)
- note when a partition can be attached (46f31c6)
- document driving the driver from code (66cf918)
- add an integration smoke test (bda392c)
- document partition tracing (c9c883d)
- add a c++ library and python bindings (9d379a5)
- test partition tracing end to end (2c61758)
- trace a partition, not just a whole disk (aa3f65e)
- fix the assertion count in the kernel row (3bb8a02)
- bring comparison.md back in line (15cdd31)
- measure the cow pool and read cache (1cee929)
- replace the single cow thread with a pool (1e50f7b)
- add an a/b harness for comparing builds (b03b725)
- stop the perf gate calling a live vm stopped (829df69)
- note we are not filing the dattobd bug (92c908c)
- drop the 16k chunk recommendation (4c22807)
- prove the dattobd write-zeroes bug (86da49c)
- add a script to measure reboot rate (4378efb)
- document why --reset alone was not safe (096a79b)
- prove a staged cbt generation survives (9b313ee)
- make the safe cbt handoff the default (63d1b86)
- add a two-phase cbt handoff (f9cca18)
- fix the suite counts in sandbox help (3de20cd)
- document the fault injection suite (bcce785)
- test noio scoping under memory pressure (0be7db7)
- drive every injected cow failure (2697edc)
- design persistent cbt and argue against it (d20a227)
- add injectable failure points to the cow path (d4b92d3)
- add the block snapshot driver (a2538ff)
