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 10
Unkeyed findings 2
Intended findings 0
Carried findings Not recorded

Cost, usage, and speed

Total bill $0.0306
Review bill $0.0306
Judge bill N/A
Tokens 46555
Duration 7m 3s

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-485020d36bca168c
Build ID
build-4ceb7cbd44e9619b
Cohort ID
cohort-0dee68ba643f6b7b
Harness
bench 1 / 10b3b2068100b7ba429855e062500eaf83b90120 dirty
Adapter
afi 1 / sha256:a1a935298956020ee6d767a756847abb4c00694c88c2eb80d454886ebc4acf8c
Exit code
0
Wall time
423
Deadline exceeded
No
Budget
Not recorded
Billing limit
$2.00

Usage

Normalized reviewer-tool usage projection

Input tokens
45780
Output tokens
775
Cached input
319104
Reasoning tokens
28447
Requests
13
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

Duration::from_hours` and `Duration::from_mins` (line 84) do not exist in `std::time::Duration` — std only has `from_secs`/`from_millis`/`from_micros`/`from_nanos` — so the proxy does not compile;… Duration::from_hours` and `Duration::from_mins` (line 84) do not exist in `std::time::Duration` — std only has `from_secs`/`from_millis`/`from_micros`/`from_nanos` — so the proxy does not compile; the whole sweep feature is dead on arrival. Needs `Duration::from_secs(3600)` / `Duration::from_secs(900)`.

bug
Category: bug Confidence: Not recorded

services/proxy/src/config.rs:83

Evidence quote

Not recorded

Suggested fix

Not recorded

rejectedNo keyed defect (scorer)
Finding f2

bug

clear_partials` unlinks every file in `incoming`, including the temp files of downloads currently in flight (`BlobWriter` creates them there, store.rs:173). The write continues into the unlinked inode, then `commit`'s rename (store.rs:259) fails with ENOENT, so every concurrent fetch that spans a sweep fails with a 500 after downloading fully — routine with the default 15-minute sweep. It must skip files younger than `min_age` (or only remove files not owned by a live writer).

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` runs unconditionally, so a `dry_run=true` sweep deletes the index entries of blobs it would have removed — the dry run is not side-effect free as its doc and the admin route promise… forget` runs unconditionally, so a `dry_run=true` sweep deletes the index entries of blobs it would have removed — the dry run is not side-effect free as its doc and the admin route promise (admin.rs:77-79). Next request for those coordinates misses and refetches; gate it on `!dry_run`.

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 instead of `run()`, bypassing the `running` mutex, so it can execute concurrently with the background sweep — exactly the… the on-demand route calls `app.sweeper.sweep(dry_run)` directly instead of `run()`, bypassing the `running` mutex, so it can execute concurrently with the background sweep — exactly the two-sweeps-over-one-directory over-eviction the module doc (sweep.rs:10-12) claims the type makes impossible.

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 f5

bug

values()` returns `sweep_bytes_reclaimed` before `sweep_blobs_removed`, while `COUNTERS` (lines 51-57) lists blobs before bytes, so `render()` publishes the blob count under… values()` returns `sweep_bytes_reclaimed` before `sweep_blobs_removed`, while `COUNTERS` (lines 51-57) lists blobs before bytes, so `render()` publishes the blob count under `cairn_proxy_sweep_bytes_reclaimed_total` and vice versa — the very mispairing the comment at line 30-32 says this layout prevents. operations.md:54 tells operators to alert on the bytes counter, which would actually alert on 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 f6

bug

the comment says a symlink is "counted at the size of the link", but `fs::metadata` follows links; a hardlink-style store double-counts linked blobs at full size and evicts prematurely. `fs::symlink_metadata` is what the comment describes.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:164

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 4 (locality)
Finding f7

bug

the comment (lines 101-102) claims the first tick is one interval away, but `tokio::time::interval`'s first tick completes immediately, so a sweep runs at startup — on a pre-populated store it… the comment (lines 101-102) claims the first tick is one interval away, but `tokio::time::interval`'s first tick completes immediately, so a sweep runs at startup — on a pre-populated store it evicts and clears `incoming` the moment the process boots, contrary to the stated intent.

bug
Category: bug Confidence: Not recorded

services/proxy/src/main.rs:108

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 7 (locality)
Finding f8

bug

when `remove_file` fails (line 126), the blob is still counted in `removed`/`bytes` and pushed to `gone`, so `forget` deletes index entries pointing at a blob still on disk and the recorded metrics… when `remove_file` fails (line 126), the blob is still counted in `removed`/`bytes` and pushed to `gone`, so `forget` deletes index entries pointing at a blob still on disk and the recorded metrics claim bytes that were never reclaimed. Only count/push on a successful (or simulated) unlink.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:137

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 2 (locality)
Finding f9

bug

sweep` runs the entire synchronous `read_dir`/`unlink` walk inline on a tokio worker thread — in both the background task and the HTTP handler — blocking that worker for the whole pass (the module's… sweep` runs the entire synchronous `read_dir`/`unlink` walk inline on a tokio worker thread — in both the background task and the HTTP handler — blocking that worker for the whole pass (the module's own example is 65,000 directories). `spawn_blocking` would keep the scheduler serving requests during a long sweep.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:90

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 11 (locality)
Finding f10

bug

cache_min_age` is the only new setting with no validation, unlike its siblings `fetch_timeout` and `sweep_interval`; a `CAIRN_CACHE_MIN_AGE=0` typo silently disables the documented grace period,… cache_min_age` is the only new setting with no validation, unlike its siblings `fetch_timeout` and `sweep_interval`; a `CAIRN_CACHE_MIN_AGE=0` typo silently disables the documented grace period, letting a store over its ceiling evict blobs seconds after they were fetched.

bug
Category: bug Confidence: Not recorded

services/proxy/src/config.rs:131

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 ·