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 30%
Model-judged precision N/A
F1 N/A
Tier 1 recall 0%
Tier 2 recall 14.3%
Tier 3 recall 50%
Tier 4 recall 50%
Security recall 50%
Defect recall 38.5%
Maintainability recall 0%
Performance recall 0%
Median anchor distance 0
Worst anchor distance 0
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.0154
Review bill $0.0154
Judge bill N/A
Tokens 46500
Duration 2m 29s

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-4c9e812aab376442
Build ID
build-944472ec933601e7
Cohort ID
cohort-b65e5ff0e0bc5ce2
Harness
bench 1 / d5372b5a9797137af68e35c478f308f58ca4510c dirty
Adapter
afi 1 / sha256:a1a935298956020ee6d767a756847abb4c00694c88c2eb80d454886ebc4acf8c
Exit code
0
Wall time
149
Deadline exceeded
No
Budget
Not recorded
Billing limit
$2.00

Usage

Normalized reviewer-tool usage projection

Input tokens
45862
Output tokens
638
Cached input
57600
Reasoning tokens
13493
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` then `sweep_blobs_removed`, but `COUNTERS` (lines 50-57) lists `..._blobs_removed_total` first, and `render` zips the two — each scrape renders the byte… values()` returns `sweep_bytes_reclaimed` then `sweep_blobs_removed`, but `COUNTERS` (lines 50-57) lists `..._blobs_removed_total` first, and `render` zips the two — each scrape renders the byte count under `cairn_proxy_sweep_blobs_removed_total` and the blob count under `..._bytes_reclaimed_total`. Operations.md tells operators to alert on `cairn_proxy_sweep_bytes_reclaimed_total`, which would actually report 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 f2

bug

forget(&index, &gone)` runs unconditionally, but `gone` is populated even when `dry_run` is true (line 137), and `forget` really deletes the index files (line 252). A `?dry_run=true` sweep — documented as reporting "without removing anything" (admin.rs, operations.md) — deletes index entries for blobs a hypothetical sweep would remove, turning "would be reclaimed" into "will be reclaimed": the surviving blobs become unreferenced and the next real sweep takes 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

reclaim` calls `app.sweeper.sweep(dry_run)` directly, bypassing the `running` mutex that `Sweeper::run` (sweep.rs:82-85) exists to take. An on-demand sweep therefore runs concurrently with the background sweep — both compute `held` from the same store and each evicts down to the ceiling, taking the store far below the ceiling either aimed at, exactly the failure the module doc (sweep.rs:10-12) says the type prevents.

bug
Category: bug Confidence: Not recorded

services/proxy/src/admin.rs:76

Evidence quote

Not recorded

Suggested fix

Not recorded

rejectedNo keyed defect (scorer)
Finding f4

performance

run` is `async` but calls the fully synchronous `self.sweep(false)` — a blocking recursive `read_dir`/`remove_file` walk over up to tens of thousands of files — directly on a tokio worker thread… run` is `async` but calls the fully synchronous `self.sweep(false)` — a blocking recursive `read_dir`/`remove_file` walk over up to tens of thousands of files — directly on a tokio worker thread (spawned at main.rs:116), stalling that worker for the whole pass instead of using `tokio::task::spawn_blocking`. The module doc rejects `tokio::fs` per-call overhead but not the blocking-the-executor cost; the route handler (admin.rs:76) blocks a worker the same way inside an async request.

performance
Category: performance Confidence: Not recorded

services/proxy/src/sweep.rs:84

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 11 (locality)
Finding f5

bug

clear_partials` removes every file in `incoming` with no age check, but `incoming` is also where live downloads are written (`temp_path`, store.rs:201-206, files that persist for the up-to-30s… clear_partials` removes every file in `incoming` with no age check, but `incoming` is also where live downloads are written (`temp_path`, store.rs:201-206, files that persist for the up-to-30s `fetch_timeout`). A sweep concurrent with traffic unlinks temp files of in-flight fetches; the writer keeps writing to the unlinked inode and `commit`'s rename fails (store.rs:259), so clients get 500s. The comment's premise ("a file in `incoming` is a fetch that is not coming back") is false for fetches still in flight.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:232

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 17 (locality)
Finding f6

bug

a blob with no index entry is removed regardless of age. Between `writer.commit()` (cache.rs:151) and `store.link()` (cache.rs:163) there is a window — the registry registration network call — during which the just-committed blob is on disk but unreferenced, so a sweep in that window deletes it and the client gets the "blob committed by this request is already missing" 500 (cache.rs:90-97). The min-age grace period is documented as covering "a package one job in a pipeline fetched" but does not cover this case.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:119

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 18 (locality)
Finding f7

bug

fs::metadata` follows symlinks, so the comment's claim that "a link is counted at the size of the link and not of whatever it points at" is false — linked-in blobs are counted at their target's full… fs::metadata` follows symlinks, so the comment's claim that "a link is counted at the size of the link and not of whatever it points at" is false — linked-in blobs are counted at their target's full size (over-counting toward eviction), and a symlinked directory is recursed into (line 168), which on a link pointing back up the tree never terminates. `symlink_metadata` plus a link/skip decision 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)

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 ·