Session summary

default

scored

afi / afi · cli reviewed proxy at 9b51f95e with Default profile / Anthropic · fable 5 high on afi 0.30.0

Measurements

Unavailable values retain their exported state and reason

Quality

Recall 35%
Model-judged precision N/A
F1 N/A
Tier 1 recall 33.3%
Tier 2 recall 14.3%
Tier 3 recall 50%
Tier 4 recall 50%
Security recall 0%
Defect recall 46.2%
Maintainability recall 0%
Performance recall 33.3%
Median anchor distance 0
Worst anchor distance 0
Refusals a judge overturned Not recorded

Review outcomes

Distinct matched defects 7
Defects missed 13
Findings 7
Unkeyed findings 0
Intended findings 0
Carried findings Not recorded

Cost, usage, and speed

Total bill $2.20
Review bill $2.20
Judge bill N/A
Tokens 138851
Duration 3m 48s

Execution and identity

Lifecycle, reviewer, build, settings, and normalized execution limits

Lifecycle
completed
Lifecycle reason
Not recorded
Started
Finished
Reviewer
afi
Reviewer tool
afi · cli
Configuration
default / 8232536cf248
Configuration ID
config-c7610bea013352e3
Build
afi 0.30.0 / b0f313c0b59a66ecc7612396dc8db0ea5da13a7a
Comparison
comparison-6173376f94cdba42
Build ID
build-c9a20474a6b1695d
Cohort ID
cohort-07363c4dd57b37b6
Harness
bench 1 / d5372b5a9797137af68e35c478f308f58ca4510c
Adapter
afi 1 / sha256:a1a935298956020ee6d767a756847abb4c00694c88c2eb80d454886ebc4acf8c
Exit code
0
Wall time
228
Deadline exceeded
No
Budget
$20.00
Billing limit
$20.00

Usage

Normalized reviewer-tool usage projection

Input tokens
136883
Output tokens
1968
Cached input
0
Reasoning tokens
14600
Requests
4
Models counted
Not recorded

Judge

Normalized assessment summary

Judge data is N/A for this run

Findings

Review text is escaped; normalized decisions follow each finding

Finding f1

bug

forget` is called unconditionally, so a `dry_run=true` sweep deletes the real index entries (`fs::remove_file` at line 252) for every blob it merely *would* have removed. A "dry" run therefore mutates the store: those coordinates become misses, and the now-unreferenced blobs are deleted by the next real sweep regardless of ceiling or age — the exact opposite of the route's "reports without removing anything" contract.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:140

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 12 (locality)
Finding f2

bug

clear_partials` unlinks every file in `incoming/` with no age or ownership check, but that directory holds the temp files of downloads *currently in flight* (`BlobStore::temp_path`, store.rs:201)… clear_partials` unlinks every file in `incoming/` with no age or ownership check, but that directory holds the temp files of downloads *currently in flight* (`BlobStore::temp_path`, store.rs:201) and of index writes (`link`, store.rs:148). A sweep landing during a fetch unlinks the temp file, so the later `fs::rename` in `BlobWriter::commit` (store.rs:259) or `link` (store.rs:152) fails with NotFound and the client request 500s; every download active at each 15-minute sweep is at risk.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:232

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 17 (locality)
Finding f3

bug

unreferenced blobs are removed with no `min_age` grace, but on the miss path a blob is committed to `blobs/` (cache.rs:151) before its index entry is written (cache.rs:163) — with a registry network… unreferenced blobs are removed with no `min_age` grace, but on the miss path a blob is committed to `blobs/` (cache.rs:151) before its index entry is written (cache.rs:163) — with a registry network round-trip in between. A sweep in that window sees a fresh, referenced-in-a-moment blob as orphaned, deletes it, and the request fails with the "blob committed by this request is already missing" 500 at cache.rs:90-97.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:119

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 18 (locality)
Finding f4

bug

values()` loads `sweep_bytes_reclaimed` before `sweep_blobs_removed`, but `COUNTERS` (lines 50-57) lists `cairn_proxy_sweep_blobs_removed_total` first, so each value is exported under the other… values()` loads `sweep_bytes_reclaimed` before `sweep_blobs_removed`, but `COUNTERS` (lines 50-57) lists `cairn_proxy_sweep_blobs_removed_total` first, so each value is exported under the other counter's name — the exact swap the comment above `COUNTERS` warns about; dashboards/alerts on `sweep_bytes_reclaimed_total` will show blob counts.

bug
Category: bug Confidence: Not recorded

services/proxy/src/metrics.rs:94

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 13 (locality)
Finding f5

bug

both compute removal sets from the same snapshot, over-evict below the ceiling, and double-count the reclaimed bytes in metrics.

bug
Category: bug Confidence: Not recorded

services/proxy/src/routes/admin.rs:76

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 11 (locality)
Finding f6

performance

Sweeper::sweep` is a synchronous walk of the whole store (up to 65k directories plus the full index) called directly from an async handler (and from the async task via `run()` at sweep.rs:84) with… Sweeper::sweep` is a synchronous walk of the whole store (up to 65k directories plus the full index) called directly from an async handler (and from the async task via `run()` at sweep.rs:84) with no `spawn_blocking`, so a sweep of a large store pins a tokio worker thread for its entire duration and stalls every other task scheduled on it.

performance
Category: performance Confidence: Not recorded

services/proxy/src/routes/admin.rs:76

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 6 (locality)
Finding f7

bug

the eviction condition `remaining >= self.max_bytes` removes a blob when the store is exactly at the ceiling, contradicting the config's definition of `cache_max_bytes` as "the most the blob store… the eviction condition `remaining >= self.max_bytes` removes a blob when the store is exactly at the ceiling, contradicting the config's definition of `cache_max_bytes` as "the most the blob store may hold" (config.rs:63); should be `>`.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:120

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 3 (locality)

Source artifacts

Open a row to inspect or download evidence from this atomically published local run

findings present

Open verified source artifact

Open this path at the exported commit

The artifact is present; its content is available through the verified source link

meta present

Open verified source artifact

Open this path at the exported commit

The artifact is present; its content is available through the verified source link

record present

Open verified source artifact

Open this path at the exported commit

The artifact is present; its content is available through the verified source link

result present

Open verified source artifact

Open this path at the exported commit

The artifact is present; its content is available through the verified source link

spend present

Open verified source artifact

Open this path at the exported commit

The artifact is present; its content is available through the verified source link

stderr present

Open verified source artifact

Open this path at the exported commit

The artifact is present; its content is available through the verified source link

summary present

Open verified source artifact

Open this path at the exported commit

The artifact is present; its content is available through the verified source link

traffic present

Open verified source artifact

Open this path at the exported commit

The artifact is present; its content is available through the verified source link

benchee benchee-dashboard-1 built from 10f4ec58 Static benchmark evidence ·