- POC #3 (register OQ-BL-06) executed and passed: streaming LFSObject-shaped
put/get at the store layer; fanout seam (serve-while-persisting) validated
as broadcast above the backends; fs range reads with the verification gap
documented (preamble makes slice-vs-whole verification impossible —
chunk-tree encoding sharpened to a transfer-layer conditional)
- sqlite-vs-fs micro-benchmark: first-party anchor for the small-blob
belief (~9-10x sqlite at 1-16 KiB, crossover ~128-256 KiB, 128 KiB
default lean); harness re-runnable on real media
- Stage-file hygiene tests caught a real leak (one temp file per failed
put) — fixed; all failure paths converge on discard
- Pack tension resolved in shape from the gix-odb read: packs as large
blobs served by range reads; object-level dedup lives in the loose tier
- iroh-blobs-eval.md written against the current checkout (e82cbdc /
v0.103.0): actor/message-protocol pattern, fs backend layout,
verification, do-not-inherit + keep lists
- alknet probe re-check demoted to historical cross-check only: alknet's
code is not a design input (decomposed; substrate is alkcall); its
small-blob perf claim was asserted-never-measured, superseded by A4
- phase-0 register complete: no open POCs; next step is convergence ->
Phase 1
Verification: POC crate (standalone /workspace/alkblobs-largeblob-poc)
14 tests pass, clippy -D warnings clean, fmt clean; digests byte-exact
vs the real git hash-object CLI on both streaming put paths
POC code: /workspace/alkblobs-trait-poc (17 tests passing, clippy -D
warnings + fmt clean; digests validated byte-exact against the real
git hash-object CLI, both object formats)
Findings (poc-trait-dispatch-findings.md, 8):
- lean Backend trait (opaque byte keys, complete list(), put-path
pinning) is sufficient; Key typed wrapper lives at the boundary
- redb traps: list() key-vs-value destructure (silent until GC
catches it — malformed list is as deadly as incomplete), virgin-db
TableDoesNotExist on first read, no in-memory db (temp file used)
- pinning: Pinned RAII guard + refcount map works; batch-scope pins
and the sweep-vs-put race are named Phase 1 requirements (iroh
DeleteSet = prior art)
- git-blob preamble abstraction validated; external-git oids address
pool entries with zero indirection (the OQ-BL-03 resolution,
implementation-confirmed)
- tagged key format ([algo byte][digest]) makes git-sha256 + git-sha1
coexist; sort-stable for sweep diffs
- dual dispatch works as simply as hoped; routing deterministic
- namespace tables: protect callback MUST share live state (the
snapshot-install bug proves the API lesson: register_liveness_source
shape, not install_into)
- GC semantics verified: exact deletion counts, abort-callback,
delete-then-recover byte-identical re-put
phase-0.md: POC #1 marked passed, #2 absorbed (validated), #4 covered
in miniature (concurrency half deferred to Phase 1 impl work);
OQ-BL-02 base settled; OQ-BL-03 implementation-validated; OQ-BL-05
mechanism settled with findings folded in; plan updated (POC #3 is
the last open POC)
- OQ-BL-03 RESOLVED: BLAKE3's presence traced to pure iroh-blobs
inheritance; with that rejected the multi-hash framing dissolves.
Three tiers: canonical git-blob-sha-256 (git oids + every other
consumer share one address domain — cross-consumer dedup free),
tolerated git-blob-sha-1 (protocol necessity, git's hardened-SHA-1
threat model), conditional BLAKE3 (only if a bao-like chunk-tree
encoding is ever adopted; confined to that encoding layer)
- Principle 2 rewritten (one canonical hash, git-family derivation);
alkgit consumer entry updated (the 'hash conflict' was an artifact
of the BLAKE3 inheritance); p2p section notes strengthened dedup
- OQ-BL-04: verification options no longer BLAKE3-mandatory; chunk-
tree encoding note — verified wholes register under the canonical
hash so chunked and whole-file paths dedup together
- POC register: #2 absorbed into #1 (postamble abstraction + SHA-1
tolerance are #1's trait work); #3 gains the sqlite-vs-fs
micro-benchmark pull-out
- AGENTS.md convention 5 aligned (canonical git-family derivation)
- Consumers: add agent workspaces (third consumer); add the p2p shape
section (contract/gossip/replicator sketch) and pin what it implies
here: pooled CAS per node, repos/workspaces as hash-reference sets
- Principles: add 6 (pooling is the point) and 7 (whole-file CAS
default; CDC scoped to large-binary edits; fixed-size trees not
inherited)
- OQ-BL-01: ops surface upgraded from speculative to likely (have/need
+ verified fetch), crate-boundary question remains
- OQ-BL-04: chunking scoped; new sub-question — chunking in store
encoding vs manifest layer
- New OQ-BL-05: pooling/GC — namespace shape, lifetime strategies,
the pack tension (constrains store surface)
- POC register: add #4 (pooled CAS + GC); note pack tension rides #3
- gix-odb: note alternates/object-pools as cross-repo dedup prior art