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 40%
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 50%
Security recall 0%
Defect recall 46.2%
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 8
Defects missed 12
Findings 8
Unkeyed findings 0
Intended findings 0
Carried findings Not recorded

Cost, usage, and speed

Total bill $0.3550
Review bill $0.3550
Judge bill N/A
Tokens 41692
Duration 2m 45s

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-908a56c0f29bc097
Build ID
build-13a6e5be87bc4a53
Cohort ID
cohort-fdab2adfb8a4bd39
Harness
bench 1 / 348a7e367b8c52f1ce72828ed09c15b0e9fac38b dirty
Adapter
afi 1 / sha256:a1a935298956020ee6d767a756847abb4c00694c88c2eb80d454886ebc4acf8c
Exit code
0
Wall time
165
Deadline exceeded
No
Budget
$12.00
Billing limit
$12.00

Usage

Normalized reviewer-tool usage projection

Input tokens
40088
Output tokens
1604
Cached input
101556
Reasoning tokens
9863
Requests
5
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

a blob with no index entry is deleted regardless of `min_age`, but a fetch commits the blob (cache.rs:151) and only writes the index entry after a registry round-trip (cache.rs:163), so a sweep in… a blob with no index entry is deleted regardless of `min_age`, but a fetch commits the blob (cache.rs:151) and only writes the index entry after a registry round-trip (cache.rs:163), so a sweep in that seconds-long gap deletes the just-committed blob — the in-flight request then 500s at cache.rs:90-97 ("already missing from the store") despite the artifact existing.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:119

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 18 (locality)
Finding f2

bug

forget(&index, &gone)` runs unconditionally and `gone` is populated even when `dry_run` is true (line 137 sits outside the `if !dry_run` guard), so `POST /v1/admin/cache/sweep?dry_run=true` —… forget(&index, &gone)` runs unconditionally and `gone` is populated even when `dry_run` is true (line 137 sits outside the `if !dry_run` guard), so `POST /v1/admin/cache/sweep?dry_run=true` — documented as removing nothing — deletes live index entries for every blob it would have reclaimed, forcing refetches of all of them.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:140

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 12 (locality)
Finding f3

bug

clear_partials` deletes every file in `incoming/` with no age or name check, but in-flight downloads and index-link temp files live there (store.rs:171-180 and store.rs:147); a sweep overlapping any… clear_partials` deletes every file in `incoming/` with no age or name check, but in-flight downloads and index-link temp files live there (store.rs:171-180 and store.rs:147); a sweep overlapping any active fetch unlinks its temp file from under the open handle, so `commit`'s rename fails with ENOENT and a download that succeeded upstream returns a 500.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:232

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 17 (locality)
Finding f4

bug

the on-demand sweep calls `sweeper.sweep()` directly, bypassing the `Mutex` that `run()` holds for the whole sweep (sweep.rs:83), so an HTTP-triggered sweep can run concurrently with the interval… the on-demand sweep calls `sweeper.sweep()` directly, bypassing the `Mutex` that `run()` holds for the whole sweep (sweep.rs:83), so an HTTP-triggered sweep can run concurrently with the interval sweep — the exact "two sweeps over one directory" over-deletion the module says the type prevents (sweep.rs:10-12) — and both will double-count the reclaimed 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

values()` loads `sweep_bytes_reclaimed` then `sweep_blobs_removed`, but `COUNTERS` declares blobs first (lines 50-57), so the two counters are exported swapped —… values()` loads `sweep_bytes_reclaimed` then `sweep_blobs_removed`, but `COUNTERS` declares blobs first (lines 50-57), so the two counters are exported swapped — `cairn_proxy_sweep_blobs_removed_total` reports bytes and `cairn_proxy_sweep_bytes_reclaimed_total` reports blob counts, defeating the pairing comment at lines 30-32 and the alerting docs/operations.md prescribes on the bytes counter.

bug
Category: bug Confidence: Not recorded

services/proxy/src/metrics.rs:94

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 13 (locality)
Finding f6

performance

sweeper.run()` executes the entire synchronous `std::fs` walk (readdir + stat + unlink over the whole store) directly on a runtime worker thread with no `spawn_blocking`, stalling request handling… sweeper.run()` executes the entire synchronous `std::fs` walk (readdir + stat + unlink over the whole store) directly on a runtime worker thread with no `spawn_blocking`, stalling request handling on that worker for the duration of the sweep — the same applies to the admin handler at routes/admin.rs:76, which is additionally on the untimed router so it can block for minutes on a large store.

performance
Category: performance Confidence: Not recorded

services/proxy/src/main.rs:116

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 6 (locality)
Finding f7

bug

after a failed `fs::remove_file` (line 126) the candidate is still counted in `removed`/`bytes` and pushed to `gone`, so the reported and recorded reclamation exceeds what was actually freed, and… after a failed `fs::remove_file` (line 126) the candidate is still counted in `removed`/`bytes` and pushed to `gone`, so the reported and recorded reclamation exceeds what was actually freed, and `forget` (line 140) deletes index entries for blobs that are still on disk.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:135

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 2 (locality)
Finding f8

bug

tokio::time::interval` completes its first tick immediately, contradicting the comment at lines 101-102 ("the first tick is one interval away") — a freshly started proxy sweeps at boot; use… tokio::time::interval` completes its first tick immediately, contradicting the comment at lines 101-102 ("the first tick is one interval away") — a freshly started proxy sweeps at boot; use `interval_at` with a delayed start to get the documented behavior.

bug
Category: bug Confidence: Not recorded

services/proxy/src/main.rs:115

Evidence quote

Not recorded

Suggested fix

Not recorded

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