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 33.3%
Tier 2 recall 14.3%
Tier 3 recall 50%
Tier 4 recall 25%
Security recall 0%
Defect recall 38.5%
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 6
Defects missed 14
Findings 8
Unkeyed findings 2
Intended findings 0
Carried findings Not recorded

Cost, usage, and speed

Total bill $0.0237
Review bill $0.0237
Judge bill N/A
Tokens 74100
Duration 5m 28s

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
328
Deadline exceeded
No
Budget
Not recorded
Billing limit
$2.00

Usage

Normalized reviewer-tool usage projection

Input tokens
73367
Output tokens
733
Cached input
75776
Reasoning tokens
20633
Requests
6
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 `from_mins` at line 84, plus the test uses at 350-351) do not exist on stable `std::time::Duration` — they are unstable `duration_constructors` methods, and… Duration::from_hours` (and `from_mins` at line 84, plus the test uses at 350-351) do not exist on stable `std::time::Duration` — they are unstable `duration_constructors` methods, and `rust-toolchain.toml` pins `channel = "stable"` with no feature gate. The proxy does not compile; the whole sweep feature is dead on arrival.

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

values()` returns `sweep_bytes_reclaimed` before `sweep_blobs_removed`, but `COUNTERS` (lines 51-57) lists `sweep_blobs_removed_total` before `sweep_bytes_reclaimed_total`, and `render` zips them… values()` returns `sweep_bytes_reclaimed` before `sweep_blobs_removed`, but `COUNTERS` (lines 51-57) lists `sweep_blobs_removed_total` before `sweep_bytes_reclaimed_total`, and `render` zips them positionally. Each sweep counter is published under the other's name — `cairn_proxy_sweep_bytes_reclaimed_total`, the one docs/operations.md tells operators to alert on, actually carries the blob count. This is exactly the fifth-under-fourth's-name failure the adjacent comment (line 30-32) claims the pairing prevents.

bug
Category: bug Confidence: Not recorded

services/proxy/src/metrics.rs:94

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 13 (locality)
Finding f3

bug

clear_partials` unlinks every file in `incoming` with no age check, but `BlobWriter` (store.rs:171-180, 242-259) keeps an open temp file there for the whole of a download — minutes for a 200 MiB… clear_partials` unlinks every file in `incoming` with no age check, but `BlobWriter` (store.rs:171-180, 242-259) keeps an open temp file there for the whole of a download — minutes for a 200 MiB artifact. A sweep concurrent with an in-flight fetch deletes that fetch's temp file, so `commit`'s rename fails and the download errors. `CAIRN_CACHE_MIN_AGE` is applied only to blobs, not partials, so even a temp file created seconds before is destroyed.

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

forget(&index, &gone)` runs unconditionally, but `gone` is populated on dry runs too (line 137). A dry run — documented in docs/operations.md and on the route as reporting "without removing anything" — deletes the index entries of every blob it would have removed, degrading those coordinates to a miss-and-refetch the next time they are requested.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:140

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 12 (locality)
Finding f5

bug

the on-demand handler calls `app.sweeper.sweep(dry_run)` directly instead of `run()`, so it never takes the `running` mutex (sweep.rs:83) and can run concurrently with the 15-minute background sweep… the on-demand handler calls `app.sweeper.sweep(dry_run)` directly instead of `run()`, so it never takes the `running` mutex (sweep.rs:83) and can run concurrently with the 15-minute background sweep in main.rs:116 — the exact two-sweeps-over-one-directory hazard the module doc (sweep.rs:10-12, 65-67) claims the type prevents. Both compute `held` from the same starting total and remove independently, driving the store far below the ceiling and double-counting reclaimed bytes.

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 f6

bug

Sweeper::sweep` is a synchronous recursive walk plus per-blob unlinks, executed directly on a tokio worker thread — both here and via `run()` awaited in the spawned task (main.rs:116). On a store of the size the module's own doc contemplates (65k leaf directories, sweep.rs:15), one sweep stalls a runtime worker for the duration, delaying every request multiplexed onto it. The sync-walk choice is defensible; running it outside `spawn_blocking` is the defect.

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 f7

bug

when `fs::remove_file` fails, the candidate is still counted into `removed`, `bytes`, and `gone`, and its index entries are then deleted by `forget`. A persistent failure (permissions, read-only mount) inflates `sweep_bytes_reclaimed_total` on every sweep with bytes never reclaimed, and drops index entries for blobs that still exist, forcing a refetch of bytes that were present.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:130

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 2 (locality)
Finding f8

bug

an index entry that fails to read or parse is skipped, which leaves its digest absent from the `index` map — so the blob it points at satisfies `!index.contains_key(hex)` (line 119) and is deleted. This is the opposite of the comment's stated intent ("deciding here that it references no blob would delete the bytes that refetch is about to find"); the consequence is one refetch per occurrence, tolerable but not what the code says it does.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:205

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 ·