Surfaced by CodeRabbit on #46 (review spans the full stack; this is B3 Arweave-recovery code from #36).
Two issues in the gl clone Arweave fallback recovery path (crates/gl/src/clone.rs):
-
Discovery truncates at 100 transactions. The GraphQL manifest query hard-codes first:100 and stops. Once a repo has more than 100 encrypted-manifest anchors (one per push), any private blob whose most recent seal falls outside that window drops out of recovery even though it is still live at HEAD. Paginate (cursor/after + pageInfo) until coverage is complete before merging per-push manifests.
-
/encrypted-blobs parsing is fail-open on schema drift. recover_encrypted_blobs parses into serde_json::Value and defaults blobs to [] via unwrap_or_default(). /withheld-paths by contrast deserializes a typed struct and errors on missing/wrong fields. Schema drift on /encrypted-blobs would silently yield "nothing to recover" rather than an error. Switch it to a strict typed response.
Owning PR: #36.
Surfaced by CodeRabbit on #46 (review spans the full stack; this is B3 Arweave-recovery code from #36).
Two issues in the
gl cloneArweave fallback recovery path (crates/gl/src/clone.rs):Discovery truncates at 100 transactions. The GraphQL manifest query hard-codes
first:100and stops. Once a repo has more than 100 encrypted-manifest anchors (one per push), any private blob whose most recent seal falls outside that window drops out of recovery even though it is still live at HEAD. Paginate (cursor/after+pageInfo) until coverage is complete before merging per-push manifests./encrypted-blobsparsing is fail-open on schema drift.recover_encrypted_blobsparses intoserde_json::Valueand defaultsblobsto[]viaunwrap_or_default()./withheld-pathsby contrast deserializes a typed struct and errors on missing/wrong fields. Schema drift on/encrypted-blobswould silently yield "nothing to recover" rather than an error. Switch it to a strict typed response.Owning PR: #36.