CUBELinux · The Builds to Date

Build record · 2026-09-23 · kernel 6.19.3-cubelinux0.7+ · newest build #102, installed and running · follows A Coordinate-Addressed OS
Update, 2026-09-25 — what has changed since this record was written. The box has rebooted into #96: dmesg reports Linux version 6.19.3-cubelinux0.7+ … #96 SMP PREEMPT_DYNAMIC Wed Sep 23 23:12:18 EDT 2026, so the “#87 is what is running” statements below describe the box as it was on 2026-09-23 rather than as it is now. The live store holds 71,586 records with errors=0 at generation 2276 (cube-image digest /var/lib/cubelinux/store.img) — the ~70,400 quoted below was that day’s figure. The workspace suite is 218 tests, 0 failures (cargo test --workspace --release); the summary strip above carries 206 from an earlier snapshot, and the front page carried 216. The runner still names 28 gates, and the run for #96 reports 26 of 26 green.

Built since this record was written: the gate on the doorway (see § Not claimed), and the boot record's guarantee and honest epoch (see § Next). Kernel #97 is built and installed — #97 SMP PREEMPT_DYNAMIC Thu Sep 24 23:44:36 EDT 2026, installed additively with nothing rebooted, so #96 is still what is running until someone reboots. The workspace suite is 224 tests, 0 failures, which is the 218 above plus the six the two builds brought with them. The wall run for #97 reports 27 of 27 gates green, with 1 skipped and not counted as passing: the USB store gate, because no dongle is attached to this machine. That accounts for all 28 gates the runner names. (The run recorded for #96 carries 26 of 26 and no skip line at all, so the two runs are not line-for-line comparable — the difference is stated here rather than given a cause this record has not checked.)

Built since this note — kernel event capture. Every record could already carry a 16-bit class, the ops to write and retrieve by class were in the kernel and gated, and the vocabulary those bits belong to was already a userspace convention; what was missing was a kernel that captures events rather than only what a caller asked for. It now writes them into the events space (0xFB): a request the interface does not offer, refused and classed ERROR; a clock correction that made the boot record’s epoch provisional, classed BOOT; and a boot whose record only landed on a retry, classed ERROR|BOOT. They are found by class with CUBE_OP_FLAG_SCAN, read like any other record, and survive the fold. The kernel’s writing about itself is bounded (EVENT_BUDGET: 32 a boot, 8 of them refusals), because a kernel that appends a record per event can turn a storm of refusals into a storm of writes. Gated by verify-event-capture, which also checks the classes the driver spells out against the mask userspace’s vocabulary names. Not claimed: the capture rides the same cube_boot_record=1 switch, only those three events exist, and a store that cannot be read at all is the one refusal the kernel cannot record into itself. Kernel #98 is built and installed; the wall run for #98 names 29 gates and reports 28 of 28 green with 1 skipped (the USB store gate — no dongle attached). The wall names 30 gates as of the fold fix below. The wall run for #102 — the kernel that is installed and running, bzImage md5 8df249f3056dc938da881c0791cc5ab9 — reports 29 of 29 green with the same single skip. The workspace suite is unchanged at 224 tests, 0 failures.

Found and fixed: a fold resurrected a deleted record. A fold turns the log's effects into the image's by keeping, per coordinate, the last entry in the merged order — that is how “the later write wins” is implemented. That order came from a derived comparison over the entry's fields in declaration order, and the class mask was declared before the arrival sequence, so the tie-break was the class and not the arrival. A del is written with no class (0); a sealed record is written with 0x0800. For the same coordinate the removal therefore sorted before the record it removed, and the record won: put → present, del → “(not found)”, cube-fold → “folded the log into the image” with the generation advancing and the log emptied, get → the value, back. Measured on the box on 2026-09-25, and reproduced through a sealed front-end and an unsealed one. The entry order is now explicit — (space, key, seq, …) — with the reason written beside it, because “the fields happen to be declared in this order” is what went wrong. Gated by verify-fold-delete: it fails against #98 with “a fold resurrected a deleted record” and passes against the kernel carrying the fix. The gate writes a classed record on purpose — an unsealed store writes both entries with the same flags, the tie falls through to the sequence, and the defect is invisible there, which is exactly what the gate did before this and why it agreed with a bug it could not see.

One qualification on numbers this record has quoted. The digest is taken over the same merged order the fold writes, so the record counts above (~70,400 … 71,944) come from a merge that could resurrect a deletion, and may include records whose removal was still in the log when they were counted. They are what the tool said; they are not certified by this defect being fixed, and the first digest taken on the kernel below is the first one that is. Kernel #102 — installed, with #98 still running until the next reboot and the previous pair kept in /boot/cubelinux-prev/. (The number moved past #99 because each build of the tree stamps a new one, including the attempts that failed to link.)

Proven on the metal, 2026-09-25 — with #102 installed and running, which is where the box stands now. The eight records the old kernel had resurrected — every one carrying flags=0x0800, which is the shape that failed — were deleted and folded twice: all five spaces read 0 record(s) afterwards and every coordinate answers (not found), where the previous kernel brought them back with their old values. And the same boot produced the case the epoch fix was written for, unprompted: this machine's clock arrived 43.96 s out, chronyd stepped it, and the kernel wrote boot=1790393113 uptime=40 clock=set — the record rewritten with the corrected time, with the clock-set event captured into the events space (0xFB, one record, flags=0x0080) rather than only logged. The first digest taken under it is therefore the first one this defect cannot have touched: 73,045 records, errors=0, generation 3623.
the store lives in the kernel a coordinate is an address a region is a seek 206 tests · 0 failures

In this document

Abstract

This is the running record of the CUBELinux builds: what the system is, what each build added, what the gates proved, and what is still ahead. The first whitepaper documents the design and is left untouched as that design record; this document records the builds, and it is written to be read on its own.

The store lives in the kernel. A coordinate is no longer only a way to name a record but a way to reach one — a lookup is a search over arithmetic addresses. A region is a way to query one: a box is found by seeking to the foot of its key span and reading forward. And as of today the whole path works on the metal: this machine boots CUBELinux, the kernel serves the store, writes are durable, listings return the store's records, and the log that makes writes cheap is now folded on a schedule instead of by hand.

Every number below is measured by a gate, by the test suite, or by a command whose output is quoted. Where something is not proven, it says so.

1. What CUBELinux is now

CUBELinux is a coordinate-addressed operating system. A coordinate is (space, point) — a 32-byte space selector and a 192-bit key produced by a space-filling curve (Morton by default) over three 64-bit axes. Records live at coordinates, not behind names; the space is a hard partition, so cross-space access is structurally impossible from a query. The store is in the kernel, the interface is cube(2), and everything above it is written against that interface — a name, a path, or a mount is a view at the edge, not the substrate.

Today that is a running system rather than a design:

2. Milestones reached

Dated, because a milestone is a thing that happened on a day:

whenmilestonehow it is known
2026-09-20/21The store moves into the kernel and the live store is converted in place — folded to the addressed format, sealed, every record and value preserved byte for byte.the store's digest before and after: same fnv1a64, 69,638 records
2026-09-21A region becomes a query: CUBE_OP_RANGE seeks a box's key span instead of scanning the space.verify-range, against userspace, over a box with a trap record inside the span and outside the box
2026-09-22The class mask travels with the record: format v4 widens the index entry, and CUBE_OP_FLAG_SCAN retrieves by class.verify-flag-scan, 18 matched records, both layouts, diffed against userspace
2026-09-23The kernel serves the live store on the metal. A listing walks the box's own 96 MiB sealed v4 store through cube(2) — 12 spaces — and every record userspace can see in the image is present in the kernel's answer.verify-enum-live, run on this machine, PASS
2026-09-23The walk terminates. A defect that made every enumeration re-serve the space forever — and took the front-end to 6.4 GiB twice, to the OOM killer — is fixed at its cause and bounded in the client. §8 names it.the walk ends on the contract's own rule: a cursor that stops moving; the front-end's resident size stays flat at 3–4 MB
2026-09-23The log folds on a schedule. cube-fold plus a daily timer; the operation no longer waits on a person.by hand: log 49,280 bytes → 0, active_slot 0 → 1, store sound afterwards
2026-09-23No red gates remain. The previous record carried one — verify-efi-boot — and re-running it is what retired the claim: the boot chain the box uses passes.verify-efi-boot, pass
2026-09-23The install gate and the way back are honest. The installer keeps a copy of the release it replaces instead of relying on a hand-made convention, and the preflight reads the boot entry rather than the running kernel.the preflight that refused this install now reports READY — 16 checks pass, one of them having become a note when the default entry was pointed at CUBELinux itself, and its judgement restated around the question that still has an answer: is a copy of the kernel this install overwrites kept? The five copies the installer had left beside the live kernels were being enumerated as ten unbootable menu entries, because 10_linux globs /boot/vmlinuz-*; they now live in /boot/cubelinux-prev/, and the menu is 17 entries rather than 27
2026-09-23The kernel joins a chain. A value written as several records at consecutive z comes back from one plain read of the first slice’s coordinate: joined, in order, with a buffer too small told the length and a hole failing the whole read rather than returning the prefix that is still there. A sealed chain is deliberately not joined, and the flags say so rather than pretending.verify-chain, seven checks, PASS — and the measurement that made reading those bits safe at all: 0 records in the live store carry any of them
2026-09-23The benchmark ran on the metal, and the write halved. Booting into an initramfs with nothing else running, cube(2) against a copy of the live store: a durable write is 4.962 ms mean and 5.652 ms worst over ten, where build #85 measured 8.2 ms — the two fsyncs becoming one, confirmed on the hardware rather than argued from the code. A read that finds its record is 11 µs; the 4 µs this record carried before was a read asking for a coordinate the store did not hold.the benchmark boot's own transcript, whose first line is the kernel's identity from uname; the boot is rehearsed in QEMU first (rehearse-bench-initramfs.sh)
2026-09-23A walk with no store behind it refuses, and says why. The defect that hung the first benchmark boot — about two hundred thousand invented records a minute, forever — is fixed at its cause: 38 error returns in the store driver negated an errno that was already negative, so a refusal reached every caller as a success. The walk arm that advances its own cursor now refuses a positive answer as well, and a store that is not there answers "No such device" instead of the walk's own end signal. §8 names all of it.the reproduction in the guest: 0 records and a boot that finishes in 5 s, where it served 364,994 invented record lines in the 90 seconds the instrument allowed; verify-no-store, pass
2026-09-23The wall was run whole, and every red it reported was chased to a cause. 26 gates, 26 pass. Four were red at some point in the day: the walk's own defect (fixed in #95), two gates accusing the kernel of what the live box was doing (both instrument defects, both fixed), and one real one — a store with no control block whose writes were acknowledged without a single flush on the path (#96), which the record had first attributed too broadly and now records as the correction it was.run-all-gates.sh — 26 named claims, one verdict, and each red held to a measurement rather than to an explanation
2026-09-23A store on a device that is not this machine. A USB dongle carries a CUBE store of its own — control block, two slots, a log — and the kernel serves it as its store: four records written at coordinates through cube(2) were walked back off the device by a later boot, after the machine that wrote them was gone. It is the smallest form of the question the cube-edge design asks about a device with its own identity, with a USB stick doing the embedded part.verify-dongle, pass — the device found by its own serial rather than by /dev/sdX, refused if anything is mounted from it, the write read back after a power cycle, and the device named as a space of its own with a portal leading to it

3. The build line

The builds that changed the system's shape, in order:

buildwhat it changedhow it was checked
#49format v3 — the image carries its own addresses: a space table, a fixed-stride index, values in index order.the live store folded to v3 with the digest unchanged
#50the fold fixed on the box; the live store converted in place, sealed.gates run on the box, store walked both ways
#52the kernel can author its own boot record — one record in a reserved space, at the first write of a boot.verify-boot-record, the record read back three ways
#53the addressing primitives move into one shared file, and the driver uses it — no second copy of the key to drift from.verify-enum, verify-syscall
#55CUBE_OP_RANGE — a region is a seek: the box's key span, binary-searched and read forward.verify-range, against userspace
—format v4 — a 16-bit class mask in both the index entry and the log entry, so a record's classification travels with it and survives a fold. Now the live store's format: the fold wrote it.verify-flag-scan, through both layouts, against userspace
—CUBE_OP_FLAG_SCAN — classify at write time, retrieve by class later. The scan names a mask, a mode (any/all) and a scope (one space, or every space).verify-flag-scan — 18 matched records diffed line for line against userspace
—one frame for every walk — get, enum, range and flag scan all return the class mask beside the key and value, so nothing has to be re-read to learn what a record is.verify-enum, verify-syscall, verify-flag-scan
—one value, several records — a chain is read back by one plain read of its first slice's coordinate: the kernel joins the slices in z order, tells a buffer too small the length it needs, and fails the whole read on a hole rather than returning the prefix that is still there. A sealed chain is not joined, and the flags say so.verify-chain — seven checks, PASS, including a userspace reader of the same vocabulary agreeing byte for byte
#79the walk skips what the cursor has already returned. Every enumeration had been re-serving its space from the first record, so the cursor—the walk's only end signal—never stopped moving. Fixed in the kernel; bounded in the client.verify-enum-live on the box, PASS; verify-enum, verify-enum-cost, verify-frontend, verify-flag-scan, verify-file-store, all pass
#95A refusal is a refusal. Every error return in the store driver had two minus signs where Error::to_errno() already carries one — 38 call sites — so a refusal reported itself as a success to every caller that tests ret < 0. That is what let a walk with no store behind it serve invented records forever. The conversions are corrected; the one walk arm that advances its own cursor now refuses a positive answer; a store that is not there answers "No such device" rather than the walk's own end signal; and the walk with no store is a gate of its own.the reproduction, in the guest: cube_store=/dev/null cubelinux.enum=1 serves 0 records, says walk: spaces failed: Invalid argument, and the boot finishes in 5 s — it served 364,994 invented record lines before. verify-no-store, pass
#96An acknowledged write is durable, in both shapes the store takes. The collapse to one fsync per append — the entry unsynced, the control block's flush carrying both — is sound where there is a control block to write. Where there is not, the count write never happens and nothing on the append path was flushed: four writes were acknowledged and gone after a kill. append now takes the entry's own fsync exactly when no later write in the same operation will carry one — one boolean, both branches gated — so the box's shape keeps the measured 4.96 ms win and the bare shape pays its entry's flush, which is what it always did.verify-kernel-append, pass — over two device shapes now, each folded the way userspace reads it and compared against the same userspace store, with the guest killed by SIGKILL and no shutdown at all; verify-torn-tail and the whole wall, 26 of 26

4. What it does

Stated as capability, so it can be checked against the machine rather than believed:

5. The store and its interface

control block   two copies, 0x0000 and 0x0800   magic, slot size, active slot, generation
image slot      ×2 (the fold writes the idle one, then flips)
[header 46]                       magic, version, curve, extents, counts
[space table: space_count × 48]   space | first index | records
[index: record_count × 40 (v3) / 42 (v4)]   key | [flags] | value offset | value length
[values: packed, in index order]
log region                        the unfolded writes, drained by a fold

The index is fixed-size and sorted by key, so a reader computes a record's place as index_off + i × INDEX_ENTRY — a coordinate is an address, exactly as claimed. The format is described once, in drivers/cube/cube_format.rs, compiled by the kernel and included by userspace; two descriptions of one format is what once shipped an hour of unsupported-version.

A fold is safe to interrupt, and that is a property of the layout rather than a hope: the image lives in two slots, a fold writes the slot that is not active and then points the control block at it. Observed on this store: active_slot 0 → 1 with image_off 4096 → 25165824, and the log went from 49,280 bytes to 0.

Through cube(2) the operations are the verbs the design always named: PUT, GET, DEL, SYNC (fold), ENUM and SPACES (the bounded cursor walks), RANGE (the region seek) and FLAG_SCAN (by class). Each argument block is versioned by its own size field, so the interface grows by gaining a block rather than by being replaced — the coordinate block is 88 bytes, the walk's own is 64, and the kernel routes on the size it is given.

6. A region is a seek

The operation the address existed for is the region query — the records of a space inside a box — and it landed as a seek rather than a filter.

The key fact is about the curve, not the query:

Monotonicity. If p ≤ q on every axis, then key(p) ≤ key(q).

Under it, a box needs no decomposition at all: its two corner keys bound every key inside it, so the index is binary-searched for the foot of that span and read forward to its head — O(log n + span) instead of O(records). Every candidate is then decoded and tested for membership, because a span is a bound, not the set: keys of points outside the box also fall inside it, and returning them would be wrong.

Monotonicity belongs to a curve, not to the trait. Morton and RowMajor have it; Hilbert does not — it transposes and rotates the axes, so its corner keys say nothing about the keys between them, and seeking on them returns wrong answers. The store gates the seek on the curve, and a curve must opt in; it cannot inherit a bound by accident.

Measured over a 32,768-record space, asking 512-record questions:

curveregionentries examinedrecords returnedover-coverage
Mortonaligned 8³ at the origin5125121.00×
Mortonthe same 512 points, slid to (5,5,5)3,5785126.99×
Hilbertaligned 8³ at the origin32,76851264.00×

The 1.00× is exactness worth naming — for an aligned cube at the origin the span is the box's keys. The 6.99× is the honest cost of a bound: an unaligned box's span covers keys of points outside it, and those are examined and rejected. The 64.00× is the gate working — Hilbert has no span, so it walks.

The gate kernel/verify-range.sh boots the kernel and diffs its answer against userspace's over an unaligned box holding a deliberate trap — a record at (2,7,7), outside the box but inside the span — and the walk is correct only if it examines that record and rejects it.

7. What the gates prove

The gate wall, and what each gate proves. The rows marked today were run on 2026-09-23 — the cost, file-store and syscall gates re-run on 2026-09-23 for the #86 change — each in its own VM or file store, so a gate is about the build rather than about what this machine happens to be running — and the box-side rows against whichever kernel was running when they were taken. The 4 µs read and the 8.2 ms write are build #85’s: they were taken before the reboot onto #86, which folds the write’s two fsyncs into one, and the box has not been re-measured since:

claimgateresult
the box's own store, walked through cube(2)verify-enum-livepass — today, on this machine, after the name table in the gate was completed (§8)
the walk answers in the kernelverify-enumpass — today
a walk with no store behind it refusesverify-no-storepass — today, and the gate is new: it boots the bench initramfs against /dev/null and against a store that is not there, and requires 0 records, a named error, and a boot that finishes
a walk costs what it returns (1.1× across a 40× store)verify-enum-costpass — today
a client, through the front-endverify-frontendpass — today
a class mask travels with the frameverify-flag-scanpass — today
a store that is a FILE, not a deviceverify-file-storepass — today
the kill switch, against a throwaway vaultverify-selfdestructpass — today, after the host fingerprint learned to tell a store from its bytes (§8)
a region is a seek, not a filterverify-rangepass
cube(2) is the same storeverify-syscallpass
a fold writes what userspace holdsverify-kernel-checkpointpass
acknowledged writes survive a killverify-kernel-appendpass — today, on both store shapes: a store with no control block, where the entry carries its own fsync, and a formatted device, where the count write's fsync carries it. It was the wall's one red until #96 fixed the shape nothing was flushing at all; §8 has the measurement and the wrong first attribution
a torn log entry is discardedverify-torn-tailpass
the kernel records its own bootverify-boot-recordpass
a sealed record is ciphertextverify-encryption + sealed-readpass
the kill switch, against a throwaway vaultverify-kill-switchpass
the boot chain the box usesverify-efi-bootpass — today; it was the one red gate in the previous record, and re-running it is what retired the claim
a reader refuses a device it cannot holdverify-store-readerspass — today: a store device refused in 0 s with the reason and the remedy, byte-identical afterwards; a 16 GB device-shaped file refused under a 2 GB cap rather than mapped; and the readers whose subject is a device still reading it
a store on the USB dongle, written and read backverify-donglepass — today, run on its own with the device attached: four records written through cube(2), the machine gone, and a later boot walking 4 space(s), 8 record(s) off the device — the records, the device's own space (0xF9 ‖ SHA-256(serial)) with its identity record, and the portal entered from this machine's root that leads to it, which the userspace decoder reads back off the device. The gate skips with a reason when the stick is not in the machine

The board names 28 gates — verify-no-store (the walk defect's own gate), verify-dongle (a store on removable media) and verify-store-readers (a device refused before it is read) are all new today. The whole wall was run for this build — 26 of the 26 it named then: 26 pass, 0 red — and the two added afterwards — verify-dongle, run on its own with the device attached, and verify-store-readers, run on its own on this machine — both pass. A wall run from here on names 28. Every red the day produced is in §8 and none of them survives as a defect: two were gates accusing the kernel of what the live box was doing, one was the walk's own, and one was a store shape whose writes were acknowledged without a single flush on the path. The workspace suite — the crate tests that underpin all of the above — is 218 passed, 0 failed.

8. Defects the gates caught

Named, because each was found only by running the real thing, and a record that shows only the green is a ledger rather than a record:

9. What the future holds

Said plainly, and separated into what is next, what is a decision, and what is not claimed:

Next

Decisions, not open items

Not claimed

10. Checking this record yourself

Every claim above has a command behind it. On the machine that serves this site's store:

cube-image digest /var/lib/cubelinux/store.img    # version, records, errors
cube-image store-info /var/lib/cubelinux/store.img # generation, active slot, log used
kernel/run-all-gates.sh verify-enum-live.sh        # the box's own store, walked
cargo test --workspace --release                   # the workspace suite

The source is public: the tree, the database work and the kernel are three repositories under cubelinux.com/git — see the terms and register for access. The kernel repository is where cube(2) and the store live; the build line above names the commits that changed its shape. (2026-10-07: the git host is offline while it is moved off the one-core testbed, so the repositories are not browsable at this address today; access is granted on request.)

How to read this document. It records a state, not an intention: the milestones are dated, the numbers are quoted from commands, and the sections on what is ahead name what is not done. If a claim here is not backed by a gate, a test, or a command whose output is shown, treat it as unproven — that is the standard this record is written to.