Session summary

default

scored

afi / afi · cli reviewed proxy at 9b51f95e with Default profile / Moonshot AI · kimi k3 high on afi 0.30.0

Measurements

Unavailable values retain their exported state and reason

Quality

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

Review outcomes

Distinct matched defects 6
Defects missed 14
Findings 7
Unkeyed findings 1
Intended findings 0
Carried findings Not recorded

Cost, usage, and speed

Total bill $0.3386
Review bill $0.3386
Judge bill N/A
Tokens 37666
Duration 2m 24s

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 / bcdf242be4e8
Configuration ID
config-9a0d29758e9a0aff
Build
afi 0.30.0 / b0f313c0b59a66ecc7612396dc8db0ea5da13a7a
Comparison
comparison-78f32eae2b308e59
Build ID
build-13a6e5be87bc4a53
Cohort ID
cohort-0dee68ba643f6b7b
Harness
bench 1 / 348a7e367b8c52f1ce72828ed09c15b0e9fac38b dirty
Adapter
afi 1 / sha256:a1a935298956020ee6d767a756847abb4c00694c88c2eb80d454886ebc4acf8c
Exit code
0
Wall time
144
Deadline exceeded
No
Budget
$12.00
Billing limit
$12.00

Usage

Normalized reviewer-tool usage projection

Input tokens
35851
Output tokens
1815
Cached input
169983
Reasoning tokens
8134
Requests
7
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

The on-demand sweep route calls `app.sweeper.sweep(dry_run)` directly and never acquires the `running` mutex — only `Sweeper::run()` (sweep.rs:83) locks it — so a manual `POST /v1/admin/cache/sweep`… The on-demand sweep route calls `app.sweeper.sweep(dry_run)` directly and never acquires the `running` mutex — only `Sweeper::run()` (sweep.rs:83) locks it — so a manual `POST /v1/admin/cache/sweep` runs concurrently with the interval sweep, and both decide removals from a shared `remaining` total, deleting up to twice the bytes needed and taking the store far below the ceiling (the exact failure sweep.rs:10-12's "one sweep at a time" comment says the mutex exists to prevent).

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 f2

bug

clear_partials` unconditionally unlinks every file in `incoming`, including partial writes of fetches actively streaming right now (`BlobWriter` holds its temp file open there until commit, per… clear_partials` unconditionally unlinks every file in `incoming`, including partial writes of fetches actively streaming right now (`BlobWriter` holds its temp file open there until commit, per store.rs:171-180) — a sweep during a long download deletes the in-progress file, which then commits to a dangling path or fails, so a client request gets a 500 because the timer fired mid-fetch; the doc comment's claim that "a file in `incoming` is a fetch that is not coming back" is false for any fetch in flight.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:91

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 9 (locality)
Finding f3

bug

values()` loads `sweep_bytes_reclaimed` fifth and `sweep_blobs_removed` sixth, but `COUNTERS` lists `cairn_proxy_sweep_blobs_removed_total` fifth and `cairn_proxy_sweep_bytes_reclaimed_total` sixth… values()` loads `sweep_bytes_reclaimed` fifth and `sweep_blobs_removed` sixth, but `COUNTERS` lists `cairn_proxy_sweep_blobs_removed_total` fifth and `cairn_proxy_sweep_bytes_reclaimed_total` sixth — so the two sweep metrics are permanently rendered under each other's names, silently swapping every reported value (the exact failure the comment above says the pairing exists to prevent).

bug
Category: bug Confidence: Not recorded

services/proxy/src/metrics.rs:94

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 13 (locality)
Finding f4

performance

sweep()` is synchronous — it walks the whole store with blocking `fs` calls, and `referenced()` additionally reads and JSON-parses every index entry file — so calling it from the axum handler blocks… sweep()` is synchronous — it walks the whole store with blocking `fs` calls, and `referenced()` additionally reads and JSON-parses every index entry file — so calling it from the axum handler blocks the worker thread for the duration of a full scan of a large store, stalling all other requests (the same blocking walk also runs on the timer at main.rs:116); the "synchronous walk costs less" rationale in sweep.rs only holds if it were dispatched to `spawn_blocking`.

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 f5

bug

forget(&index, &gone)` runs even on a dry run (sweep.rs:90's `dry_run` gate only covers blob and partial removal), so `POST /v1/admin/cache/sweep?dry_run=true` permanently deletes index entries —… forget(&index, &gone)` runs even on a dry run (sweep.rs:90's `dry_run` gate only covers blob and partial removal), so `POST /v1/admin/cache/sweep?dry_run=true` permanently deletes index entries — directly contradicting the documented "reports what a sweep would reclaim without removing anything" and forcing refetches/re-registration for those coordinates.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:140

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 12 (locality)
Finding f6

bug

after a failed `fs::remove_file` (logged at :130) the code still does `bytes += candidate.size; removed += 1` unconditionally, so `Reclaimed` and the… after a failed `fs::remove_file` (logged at :130) the code still does `bytes += candidate.size; removed += 1` unconditionally, so `Reclaimed` and the `cairn_proxy_sweep_bytes_reclaimed_total`/`blobs_removed_total` counters report space as reclaimed that is still on disk — the metric operations docs tell operators to alert on.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:135

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 2 (locality)
Finding f7

bug

Duration::from_hours(1)` and `Duration::from_mins(15)` (also used at :84 and in tests at :350-351) are nightly-only std APIs, while services/proxy/rust-toolchain.toml pins `channel = "stable"` — the… Duration::from_hours(1)` and `Duration::from_mins(15)` (also used at :84 and in tests at :350-351) are nightly-only std APIs, while services/proxy/rust-toolchain.toml pins `channel = "stable"` — the crate will not compile on the pinned toolchain once that gate hits stable Rust.

bug
Category: bug Confidence: Not recorded

services/proxy/src/config.rs:83

Evidence quote

Not recorded

Suggested fix

Not recorded

rejectedNo keyed defect (scorer)

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 ·