- tests/conformance/local_column.rs: the first dual-tier column, run
against the kv = mem + large = local factory (ADR-012 §6.3) — fresh
temp-root store per open, per-instance tracked roots, idempotent
teardown safe against abandoned/panicking rows (structural tests
included); never skips (mem-gated — the dual-tier constructor rides
feature mem until wave 3 provides an ungated kv engine)
- the reference INV row set (rows.rs) mirrored against the dual-tier
factory at a column-declared tuned threshold (1024), so the shared
matrix and race fixtures exercise both tiers' bodies (INV-7)
- dispatch rows grown: pure-function routing across put paths and
re-puts with an on-disk placement oracle (tier residency is
facade-invisible; with kv = mem the medium is the oracle), threshold
boundary legs at the tuned and shipped-default thresholds with the
constructor-tuned re-route leg, and fall-through per op with
both-tier miss shapes (ADR-003/ADR-012 §6.1/§6.3/§6.5)
- local-specific rows: on-disk stage-hygiene exact counts over both
put paths (the real stage form, INV-3), pread windows over committed
files with slice digests verified independently (ADR-006/ADR-010),
virgin-store no-ops on a fresh root, and exact sweep counts over a
both-tiers pool (INV-4/INV-5's both-tiers form)
- rows.rs shared fixtures made pub(crate); README records the column's
row inventory (§Columns beyond the reference set), the declared-
threshold posture, and the new current state
- stat-as-stat rides the mirrored INV-6 row's over-threshold legs;
the Drop-cancellation hygiene form stays per-engine (recorded)
Verification: cargo test (default) green; cargo test --features mem
green (97 lib + 37 conformance + 4 git-interop); cargo test
--all-features green; clippy --all-targets -D warnings green in both
feature shapes (default + all-features); cargo fmt --check green;
cargo doc --no-deps shows only the pre-existing warning class
- rows.rs: the reference row set (INV-1…6 + two constructor-mode rows),
factory-generic and engine-uniform, every row ADR-stamped and traced
to the backlog: round-trips over the content matrix on both put
paths, dedup (same/cross-path), stage hygiene (both paths, both
injectable failure modes, kv-degenerate residue via sweep outcomes),
sweep safety (full-protection-set happy shape, all three
GcAbortCause abort shapes incl. the single-flight SweeperLock lease,
the sweep-vs-pinned-put race), list correctness through exact sweep
outcomes only, stat discipline, mem-only posture, and kv-only
put-time rejection (threshold discovered by free probes; immediate/
mid-stream rejections and at-threshold-lands legs)
- mem_column.rs: the column's factories — mem-only (reference host)
and kv-only(mem) at a declared threshold — fresh isolated opens,
no-op idempotent teardown; structural factory-contract tests cover
isolation and teardown against a panicking row
- README: the reference row set recorded (INV-7's basis — what other
columns mirror), the row-lifecycle convention, column plan and
current state updated
- task suite-column-mem: status completed, notes and summary filled
Verification: cargo test --features mem (97 lib + 18 conformance +
4 git-interop), cargo test (default), cargo test --all-features,
clippy --all-features --all-targets -D warnings, fmt --check, and
cargo doc --no-deps — all green
- `put(len: Option<u64>, stream: impl AsyncRead + Unpin + Send) -> (Key, Pin)`:
known-length one-pass flow; unknown-length buffer-to-threshold flow with
the mid-stream fresh-stage flush (ADR-003 option (d), three numbered rules:
flush-and-continue, derivation over the eventual stored artifact as a
whole via buffer form and StagingCursor read-back form, zero residue on
stream error)
- staged-put seam amended (operator sign-off): `put_staged()` keyless
handout, `StagingCursor::commit(self, key)` publishes under the
store-core-resolved key — the canonical key completes at stream end and
the wave-1 handout shape could not express the commit-rename flow
- pin-before-publish rides the arbitration lock on both paths and both
tiers; dedup re-puts refcount the existing entry
- Batch seam: `Store::batch()` + `put_in_batch()`, members publish pin-
before-publish, group pins drop together on `Batch::commit` (new public
verb) or drop
- kv-only rejection (ADR-012 §6.2): known-length over-threshold rejects
immediately (stream never read), unknown-length at mid-stream overflow;
zero residue; error carrier `Io(String)` (named design point)
- declared-len mismatch rejects `Verification` zero-residue (named design
point); stream shape generic-no-dyn (named design point)
- incremental BlobHasher (pinned byte-equal to Algorithm::derive);
AnyStaging cursor dispatch; git-interop put-path leg against
git hash-object; eleven put-path behavior tests
Verification: cargo test (default/--features mem/--all-features) green;
clippy --all-targets -D warnings green in all three feature shapes;
cargo fmt --check green; cargo doc --no-deps at the 24-warning baseline.
The wave-2 facade skeleton and routing (tasks/store-construction.md):
the public surface consumers program against, with the ops methods
still to land against it in store-read-paths/gc-protocol/store-put-paths.
- src/store.rs — the public `Store` type (engine-blind, ADR-007/008/
010) over crate-internal tier enums (`KvEngine`{mem}, `LargeEngine`{
local}): the engine-representation design point decided as concrete
+ enum dispatch, generic rejected (pub(crate) engines, no dyn);
the three constructor modes as named constructors — `mem_only`,
`kv_only_mem`, `dual_tier_mem_local` (the ADR-012 §6.3
dispatch-coverage shape) — with `StoreMode` introspection; the
write-side routing seam (`tier_for`), the read-side fall-through
order (`kv()` then `large()`, ADR-012 §6.1), and the `GcHome`
GC-state field; the ADR-012 §3 fleet declaration ruled deferred to
the engine waves (nothing fleet-valid is constructible yet)
- src/dispatch.rs — the pure routing function (`route`, at-or-below
→ kv), `DEFAULT_DISPATCH_THRESHOLD` (128 KiB) exported at the
crate root, boundary-value unit tests (exactly-at-threshold,
degenerate tunings, purity)
- src/gc.rs — `GcHome`: the store-instance GC-state home the
gc-protocol task fills (in-process; fleet state stays on the
engine-state seam per ADR-010 §2/ADR-012 §4)
- tests/conformance — the wave-2 binding made as anticipated: the
factory's `Store` associated type collapsed into the concrete
`alkblobs::Store` (`open` vends it directly), recorded in
factory.rs + README; the wave-1 mock probe retired, replaced by
mem-gated binding demo factories (binding.rs) over both
constructible shapes
Verification: `cargo test` (default), `cargo test --features mem`,
`cargo test --all-features` green (41/53/53 unit + conformance
targets green in all three shapes); `cargo clippy --all-targets
-- -D warnings` green in all three feature shapes; `cargo fmt
--check` green; `cargo doc --no-deps` adds no warnings beyond the
pre-existing private-intra-doc-links class.
- tests/conformance/README.md: the convention doc — row naming (property-
stated names, engine dimension is the column), the Contract stamp:
format (the alkstore ADR-017 §4.2 convention adapted), the one-
normative-owner-per-property rule, the factory contract (fresh
isolated instance per open, idempotent teardown, safe over an
abandoned instance), the SKIP posture (SQL-attached columns skip
cleanly server-less; acceptance requires green against the server),
the invariant backlog (the seven store-api.md §Invariants registered
as the rows-to-grow table with pinning citations), and the mem-first
column plan (mem is the contract-reference engine, ADR-011 §2)
- harness skeleton, compile-able with zero rows: StoreFactory (fresh
+ isolated + idempotent-teardown contract; the Store associated type
is wave 2's binding point for the facade type), stamp.rs (the
marker + convention anchor), backlog.rs (in-code registry with a
traceability gate asserting INV-1..7 mirror §Invariants in order)
- no engine-specific code; no dependencies added
Verification: cargo test (33 passed across lib + 3 targets),
cargo clippy --all-targets -- -D warnings, cargo fmt --check
Wave 1 task core-hashing-keys: the crate's declared one-way door,
implemented byte-exact to ADR-002.
- src/hashing.rs: Algorithm (exactly GitBlobSha256 canonical /
GitBlobSha1 tolerated; BLAKE3 absent), Digest (known-length
derivation H("blob <len>\0" + content) as primary constructor;
from_git_oid_hex interop constructor, lowercase-only acceptance),
and the hashing::registry constants (0x01/0x02, 0x00 reserved; new
algorithm = new ADR)
- src/keys.rs: typed Key wrapper; as_bytes/from_bytes are the only
backend-boundary conversions; 1 algorithm byte + digest bytes
(33/21 total); rejects-never-guesses validation -> Error::KeyInvalid
- tests/git_interop.rs: the load-bearing test — byte-exact derivation
against the `git hash-object` CLI, both algorithms, small and
75-KiB content; external-oid round-trip into pool keys; both oid
formats coexisting in one flat pool
- named design point (oid hex policy): lowercase-only acceptance,
recorded in the task Notes and on from_git_oid_hex
Verified: cargo test (15 passed), cargo clippy --all-targets -- -D
warnings, cargo fmt --check, cargo test --all-features — all green.