bug
forget` runs even for `dry_run=true`, deleting index entries and turning a supposedly non-destructive preview into cache misses and upstream refetches
services/proxy/src/sweep.rs:140
Evidence quote
Not recorded
Suggested fix
Not recorded
afi / afi · cli reviewed proxy at 9b51f95e with Default profile / OpenAI · gpt 5.6 sol high on afi 0.30.0
Unavailable values retain their exported state and reason
Lifecycle, reviewer, build, settings, and normalized execution limits
89cd13e3b4e0config-323a87a9eb99b1e3b0f313c0b59a66ecc7612396dc8db0ea5da13a7acomparison-004ca4a8ec71f5cdbuild-13a6e5be87bc4a53cohort-fdab2adfb8a4bd39348a7e367b8c52f1ce72828ed09c15b0e9fac38b dirtysha256:a1a935298956020ee6d767a756847abb4c00694c88c2eb80d454886ebc4acf8cNormalized reviewer-tool usage projection
Normalized assessment summary
Review text is escaped; normalized decisions follow each finding
forget` runs even for `dry_run=true`, deleting index entries and turning a supposedly non-destructive preview into cache misses and upstream refetches
services/proxy/src/sweep.rs:140
Evidence quote
Not recorded
Suggested fix
Not recorded
The sweep unlinks every file in `incoming` without checking age or ownership, including active artifact and index writes, causing concurrent fetches to fail during commit or link
services/proxy/src/sweep.rs:232
Evidence quote
Not recorded
Suggested fix
Not recorded
A newly committed blob is temporarily absent from the index before `BlobStore::link`, so a concurrent sweep treats it as orphaned, deletes it, and makes the in-flight cache request fail
services/proxy/src/sweep.rs:119
Evidence quote
Not recorded
Suggested fix
Not recorded
fs::metadata` follows directory symlinks, so recursive collection can escape the blob root and the sweep can delete files in the symlink target
services/proxy/src/sweep.rs:164
Evidence quote
Not recorded
Suggested fix
Not recorded
On-demand sweeps call `sweep` directly instead of the mutex-protected `run`, allowing HTTP sweeps and the scheduled sweep to overlap and over-evict the cache
services/proxy/src/routes/admin.rs:76
Evidence quote
Not recorded
Suggested fix
Not recorded
The synchronous recursive filesystem walk runs directly on a Tokio worker thread, so a large scheduled or HTTP sweep can stall unrelated requests
services/proxy/src/sweep.rs:84
Evidence quote
Not recorded
Suggested fix
Not recorded
Sorting elapsed ages ascending processes the newest blobs first, so capacity eviction removes recently written blobs instead of the oldest ones
services/proxy/src/sweep.rs:102
Evidence quote
Not recorded
Suggested fix
Not recorded
Failed deletions are still subtracted from `remaining`, counted as reclaimed, and added to `gone`, so the sweep can delete their index entries while leaving the bytes on disk and falsely report the… Failed deletions are still subtracted from `remaining`, counted as reclaimed, and added to `gone`, so the sweep can delete their index entries while leaving the bytes on disk and falsely report the store under its ceiling
services/proxy/src/sweep.rs:134
Evidence quote
Not recorded
Suggested fix
Not recorded
Sweep metric values are emitted in the reverse order of `COUNTERS`, causing the blobs-removed metric to report bytes and the bytes-reclaimed metric to report blob count
services/proxy/src/metrics.rs:94
Evidence quote
Not recorded
Suggested fix
Not recorded
Eviction age uses modification time, which cache reads never update, so frequently accessed old blobs are treated as cold and evicted while less-used newer blobs remain
services/proxy/src/sweep.rs:186
Evidence quote
Not recorded
Suggested fix
Not recorded
tokio::time::interval` yields its first tick immediately, so the proxy sweeps at startup rather than waiting one configured interval as documented
services/proxy/src/main.rs:108
Evidence quote
Not recorded
Suggested fix
Not recorded
Using `remaining >= self.max_bytes` evicts a blob when usage exactly equals the configured maximum, even though the store is already within the ceiling
services/proxy/src/sweep.rs:120
Evidence quote
Not recorded
Suggested fix
Not recorded
Open a row to inspect or download evidence from this atomically published local run
Open this path at the exported commit
The artifact is present; its content is available through the verified source link
Open this path at the exported commit
The artifact is present; its content is available through the verified source link
Open this path at the exported commit
The artifact is present; its content is available through the verified source link
Open this path at the exported commit
The artifact is present; its content is available through the verified source link
Open this path at the exported commit
The artifact is present; its content is available through the verified source link
Open this path at the exported commit
The artifact is present; its content is available through the verified source link
Open this path at the exported commit
The artifact is present; its content is available through the verified source link
Open this path at the exported commit
The artifact is present; its content is available through the verified source link