Session summary

default

scored

afi / afi · cli reviewed proxy at 9b51f95e with Default profile / Z.AI · glm 5.3 flash high on afi 0.30.0

Measurements

Unavailable values retain their exported state and reason

Quality

Recall 40%
Model-judged precision N/A
F1 N/A
Tier 1 recall 33.3%
Tier 2 recall 42.9%
Tier 3 recall 50%
Tier 4 recall 25%
Security recall 50%
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 8
Defects missed 12
Findings 8
Unkeyed findings 0
Intended findings 0
Carried findings Not recorded

Cost, usage, and speed

Total bill $0.0139
Review bill $0.0139
Judge bill N/A
Tokens 41967
Duration 1m 44s

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 / be7c5b1aa470
Configuration ID
config-e5f3155850f5053d
Build
afi 0.30.0 / b0f313c0b59a66ecc7612396dc8db0ea5da13a7a
Comparison
comparison-0c0e860f8f5a8c1d
Build ID
build-ed27ce6ea3029905
Cohort ID
cohort-fdab2adfb8a4bd39
Harness
bench 1 / a7aa25027b6edfbb2a50b13e24d995fdd4f95ca8
Adapter
afi 1 / sha256:a1a935298956020ee6d767a756847abb4c00694c88c2eb80d454886ebc4acf8c
Exit code
0
Wall time
104
Deadline exceeded
No
Budget
Not recorded
Billing limit
$2.00

Usage

Normalized reviewer-tool usage projection

Input tokens
41480
Output tokens
487
Cached input
48384
Reasoning tokens
12405
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

values()` returns `sweep_bytes_reclaimed` before `sweep_blobs_removed`, but `COUNTERS` (lines 51-57) lists `cairn_proxy_sweep_blobs_removed_total` first — `render()` zips them in order, so every… values()` returns `sweep_bytes_reclaimed` before `sweep_blobs_removed`, but `COUNTERS` (lines 51-57) lists `cairn_proxy_sweep_blobs_removed_total` first — `render()` zips them in order, so every scrape publishes the byte count under the blobs-removed name and vice versa; any alert or dashboard built on the documented counter names reads the wrong quantity.

bug
Category: bug Confidence: Not recorded

services/proxy/src/metrics.rs:94

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 13 (locality)
Finding f2

bug

clear_partials` unlinks every file in `incoming` with no age or ownership check, but `BlobStore::writer` (store.rs:171-180) puts the temp file of every *in-flight* fetch there — a sweep concurrent… clear_partials` unlinks every file in `incoming` with no age or ownership check, but `BlobStore::writer` (store.rs:171-180) puts the temp file of every *in-flight* fetch there — a sweep concurrent with any active download unlinks its temp, so the fetch's `commit` rename fails (store.rs:259) and the download errors out; the "a file in `incoming` is a fetch that is not coming back" premise is false for live writers, and `CAIRN_CACHE_MIN_AGE` is not honoured here either.

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

forget(&index, &gone)` runs unconditionally, including on a dry run — nothing in `sweep` removes blobs during a dry run, yet `gone` holds every candidate that *would* be removed, so `?dry_run=true`… forget(&index, &gone)` runs unconditionally, including on a dry run — nothing in `sweep` removes blobs during a dry run, yet `gone` holds every candidate that *would* be removed, so `?dry_run=true` (documented as reporting "without removing anything") actually deletes the index entries naming those blobs, turning a read-only query into a destructive one.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:140

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 12 (locality)
Finding f4

bug

the on-demand route calls `app.sweeper.sweep(dry_run)` directly, which does not take the `running` mutex (sweep.rs:83) that exists precisely so two sweeps cannot each compute from a total the other… the on-demand route calls `app.sweeper.sweep(dry_run)` directly, which does not take the `running` mutex (sweep.rs:83) that exists precisely so two sweeps cannot each compute from a total the other is changing — a `POST /v1/admin/cache/sweep` racing the interval sweep (or a second POST) makes both evict against the same `held`, driving the store far below the ceiling and double-counting `removed`/`bytes` in the 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 f5

bug

when `fs::remove_file` fails (line 126), the blob is still pushed to `gone` and counted in `removed`/`bytes`, so `forget` deletes index entries pointing at a blob that still exists (next resolve… when `fs::remove_file` fails (line 126), the blob is still pushed to `gone` and counted in `removed`/`bytes`, so `forget` deletes index entries pointing at a blob that still exists (next resolve misses and refetches) and the sweep metrics overstate what was reclaimed.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:137

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 2 (locality)
Finding f6

bug

the doc comment claims "the first tick is one interval away", but `tokio::time::interval`'s first tick completes immediately, so a sweep runs at startup — harmless on an empty store, but on a… the doc comment claims "the first tick is one interval away", but `tokio::time::interval`'s first tick completes immediately, so a sweep runs at startup — harmless on an empty store, but on a restart with a populated store and clients already hitting it, it makes the in-flight-partial deletion and the commit→link eviction window in `sweep.rs` fire on the very first requests rather than one interval in.

bug
Category: bug Confidence: Not recorded

services/proxy/src/main.rs:108

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 7 (locality)
Finding f7

bug

sweep()` is fully synchronous (the module doc at sweep.rs:14-18 commits to stdlib `fs`), and the handler runs it inline on a tokio worker thread — a walk over tens of thousands of directories plus a… sweep()` is fully synchronous (the module doc at sweep.rs:14-18 commits to stdlib `fs`), and the handler runs it inline on a tokio worker thread — a walk over tens of thousands of directories plus a read of every index entry can block a worker for minutes, starving the very cache serves the untimed route exists to protect; it needs `spawn_blocking`.

bug
Category: bug Confidence: Not recorded

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

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 6 (locality)
Finding f8

bug

collect` recurses through symlinked directories (`fs::metadata` follows symlinks, `is_dir()` is true for a dir symlink) with no cycle check, despite the comment at lines 160-163 explicitly… collect` recurses through symlinked directories (`fs::metadata` follows symlinks, `is_dir()` is true for a dir symlink) with no cycle check, despite the comment at lines 160-163 explicitly contemplating a store populated by links — a symlink loop under `blobs/` recurses until the stack overflows, taking down the process.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:168

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 4 (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 ·