You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Status: Not started; no measurement exists on either side for the number this issue is about. Filed 2026-09-20 from the #205/#190 attribution round (ledger L53).
Related:#179 (projection/runtime, the FUSE design this depends on) · #205 (where the gap was measured) · #190 (read path) · #70 (FUSE request overhead, older numbering).
The requirement
The replacement core must be competitive with v0.1.6 behind a FUSE projection, measured on matched semantics. Today it is not comparable, and the reason is a scope difference rather than a demonstrated slowness — so the first deliverable is a matched comparison, not an optimization.
Why this is not yet a comparison
v0.1.6's recorded create phase — create_workspace_session, the FUSE mount — is 9–11 ms, and it is flat across history depth (issue154/final-complete-matrix.json):
case
create (mount)
commit
boundary-cycle k10 → k100
11.14 → 9.14 ms
3.19 → 3.11 ms
large-hotset k10 → k100
10.17 → 9.77 ms
3.44 → 3.06 ms
namespace-inode k10 → k100
9.90 → 9.82 ms
4.31 → 4.15 ms
That call materialises no content: it pins the branch, creates a state dir, attaches the projection and reads initial tree metadata (crates/layerfs-workspace/src/lifecycle.rs:452). Construction on the legacy side happens inside Commit/push.
The replacement core, by contrast, pays eagerly and inside the measured operation: at stride10 content 1.585 s, filesystem 5.146 s, accept_loop 8.820 s — for work the FUSE design defers to first read.
v0.1.6 mount = branch pin + dir + attach + tree-metadata read -> 9-11 ms
core (today) = construct every changed path + rebuild + publish -> 1.04-5.15 s / state
v0.1.6 first read after mount -> NEVER MEASURED
So "9–11 ms vs 1–5 s" measures a lazy mount against an eager materialisation, and the decisive half is missing on both sides. v0.1.6's historical_access family is exactly the missing operation — mount a retained state, perform declared reads — and it declares performance N/A in all six cases. No read-after-history case has ever been run on the core either.
A mount node, so the core has a direct counterpart to v0.1.6's 9–11 ms. Expectation from measured neighbours (store.create 4–5 ms) is single-digit to low-double-digit ms; that is an expectation to test, not a number to claim.
First read after mount, measured, with the read fraction declared — the fraction of the stored history the workload actually touches. This is the number that decides the trade and it currently exists nowhere.
A matched v0.1.6 figure for the same operation (its deferred read cost), or an explicit statement that the comparison is unmatched and no speed claim is made.
Both axes reported where the design trades space for time, per the owner's standing ruling.
The condition the requirement must be stated with
FUSE relocates this cost; it does not delete it. Ingest still has to construct and admit whatever it serves. The trade is decided by the read fraction:
workload shape
expected outcome
reads a small fraction of what it stores
FUSE wins — v0.1.6's shape
reads most of what it stores
FUSE loses — same construction, plus fault/round-trip overhead
This lane's history-stride1 row is the second shape (904,143 path-states, 4,936,693,030 bytes of cumulative logical history, 217,646 changed paths). So "competitive with v0.1.6" is only meaningful once the read fraction is fixed; the honest target is a crossover curve, not a single number.
What must not happen
No cost moved into setup to make the timed region look fast. Deferring construction to read time is legitimate design; moving it outside the timer is not. The rule is the same as the harness's: if a phase's work is going to happen, the phase that is measured must pay for it.
No invented cold stance, no pre-touched inputs, no shrunk selection, and no comparison against a v0.1.6 number measured on a different corpus or a different operation.
No percentage or shortfall claim from unmatched arithmetic. The historical 11,370,679,212 ns is v0.1.6's Commit, excludes its fixture install and workload exec, and is not a matched figure.
Preserve authentication, bounds, error/visibility behaviour and the single construction worker.
Open questions for the owner
Is the core's eager filesystem cost intended? It is what makes the Store dedupe a whole history in one operation — this lane's actual claim — so it is not obviously a defect.
Which read fraction defines "competitive"? Without a ruling the requirement cannot be satisfied or failed.
Does the v0.1.6 side get re-measured for the deferred read (a matched arm), or is the comparison declared unmatched and closed as descriptive only? The scaling handoff currently says do not rerun v0.1.6 for the v0.1.7: retained-history read optimizations and remaining qualification gaps #190 continuation; that constraint needs an explicit exception if criterion 4 is to be met.
Status: Not started; no measurement exists on either side for the number this issue is about. Filed 2026-09-20 from the #205/#190 attribution round (ledger L53).
Related: #179 (projection/runtime, the FUSE design this depends on) · #205 (where the gap was measured) · #190 (read path) · #70 (FUSE request overhead, older numbering).
The requirement
The replacement core must be competitive with v0.1.6 behind a FUSE projection, measured on matched semantics. Today it is not comparable, and the reason is a scope difference rather than a demonstrated slowness — so the first deliverable is a matched comparison, not an optimization.
Why this is not yet a comparison
v0.1.6's recorded
createphase —create_workspace_session, the FUSE mount — is 9–11 ms, and it is flat across history depth (issue154/final-complete-matrix.json):create(mount)That call materialises no content: it pins the branch, creates a state dir, attaches the projection and reads initial tree metadata (
crates/layerfs-workspace/src/lifecycle.rs:452). Construction on the legacy side happens inside Commit/push.The replacement core, by contrast, pays eagerly and inside the measured operation: at stride10
content1.585 s,filesystem5.146 s,accept_loop8.820 s — for work the FUSE design defers to first read.So "9–11 ms vs 1–5 s" measures a lazy mount against an eager materialisation, and the decisive half is missing on both sides. v0.1.6's
historical_accessfamily is exactly the missing operation — mount a retained state, perform declared reads — and it declares performanceN/Ain all six cases. No read-after-history case has ever been run on the core either.Acceptance criteria
store.create4–5 ms) is single-digit to low-double-digit ms; that is an expectation to test, not a number to claim.The condition the requirement must be stated with
FUSE relocates this cost; it does not delete it. Ingest still has to construct and admit whatever it serves. The trade is decided by the read fraction:
This lane's
history-stride1row is the second shape (904,143 path-states, 4,936,693,030 bytes of cumulative logical history, 217,646 changed paths). So "competitive with v0.1.6" is only meaningful once the read fraction is fixed; the honest target is a crossover curve, not a single number.What must not happen
11,370,679,212 nsis v0.1.6's Commit, excludes its fixture install and workload exec, and is not a matched figure.Open questions for the owner
filesystemcost intended? It is what makes the Store dedupe a whole history in one operation — this lane's actual claim — so it is not obviously a defect.