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 28.6%
Tier 3 recall 50%
Tier 4 recall 50%
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 9
Unkeyed findings 1
Intended findings 0
Carried findings Not recorded

Cost, usage, and speed

Total bill $0.0144
Review bill $0.0144
Judge bill N/A
Tokens 40820
Duration 1m 59s

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

Usage

Normalized reviewer-tool usage projection

Input tokens
39997
Output tokens
823
Cached input
64512
Reasoning tokens
12659
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

values()` returns `sweep_bytes_reclaimed` and `sweep_blobs_removed` in the opposite order to `COUNTERS` (metrics.rs:51-57), so `render()`'s zip publishes the blob count under… values()` returns `sweep_bytes_reclaimed` and `sweep_blobs_removed` in the opposite order to `COUNTERS` (metrics.rs:51-57), so `render()`'s zip publishes the blob count under `cairn_proxy_sweep_bytes_reclaimed_total` and the byte count under `cairn_proxy_sweep_blobs_removed_total`. operations.md tells operators to alert on the bytes counter specifically, so the alert reads blob counts (e.g. 12 blobs) as bytes reclaimed.

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

clear_partials` unlinks every file in `incoming/` with no age check, but that is where `BlobWriter` (store.rs:201-206) keeps the temp file of a fetch currently in progress. A 200 MiB download spanning a sweep loses its file mid-write; `commit`'s rename then fails on a path that no longer exists and the whole fetch errors after all bytes were transferred. Every sweep interval kills every in-flight download.

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(&index, &gone)` runs unconditionally, including for a dry run, so `?dry_run=true` — documented in admin.rs:58-60 as reporting what a sweep "would reclaim without removing anything" — still… forget(&index, &gone)` runs unconditionally, including for a dry run, so `?dry_run=true` — documented in admin.rs:58-60 as reporting what a sweep "would reclaim without removing anything" — still deletes the index entries for every digest it would have removed. The dry run is a write, and each dry run forces a refetch (and re-link) of every blob it merely reported on.

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 `sweeper.sweep(dry_run)` directly instead of `sweeper.run().await`, bypassing the `running` mutex (sweep.rs:82-85) that exists precisely so two sweeps never interleave. A manual sweep concurrent with the background one makes both compute removals from a total the other is already shrinking, over-evicting past the ceiling and double-counting bytes in the 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

the synchronous directory walk and unlinks (sweep.rs:90-149) run inline on a tokio worker thread; on a store with tens of thousands of blobs the module's own estimate (sweep.rs:14-17) this blocks a… the synchronous directory walk and unlinks (sweep.rs:90-149) run inline on a tokio worker thread; on a store with tens of thousands of blobs the module's own estimate (sweep.rs:14-17) this blocks a runtime worker for minutes while serving requests, and the route is deliberately exempted from the `TimeoutLayer` (routes/mod.rs:122-130) so nothing bounds it. It belongs in `run()` under `spawn_blocking` (or the lock held across a blocking task).

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 f6

bug

a blob committed by an in-flight fetch between the `referenced()` snapshot (sweep.rs:92) and the unlink loop is absent from the index map and is deleted as unreachable, even though its index entry… a blob committed by an in-flight fetch between the `referenced()` snapshot (sweep.rs:92) and the unlink loop is absent from the index map and is deleted as unreachable, even though its index entry is written moments later — so `forget` (sweep.rs:140) then deletes that fresh entry too. On a long sweep of a busy store this evicts just-fetched packages, defeating the `CAIRN_CACHE_MIN_AGE` grace the docs promise.

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

when `fs::remove_file` fails (sweep.rs:126-131), the candidate is still counted: `remaining` is reduced, `bytes` and `removed` incremented, and its digest pushed to `gone`. A blob that was already gone via a purge gets reported as reclaimed bytes the store never gave up, and `remaining` then under-counts the true store size, letting a sweep stop while the store is still over its ceiling.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:134

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 2 (locality)
Finding f8

bug

fs::metadata` follows symlinks, so a symlinked blob is counted at its target's size, contradicting the comment at sweep.rs:160-163 which claims links are counted at the link's own size… fs::metadata` follows symlinks, so a symlinked blob is counted at its target's size, contradicting the comment at sweep.rs:160-163 which claims links are counted at the link's own size (`fs::symlink_metadata` would be needed for that). A store assembled with hard/sym links is measured against the wrong total for the ceiling.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:164

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 4 (locality)
Finding f9

bug

CAIRN_SWEEP_INTERVAL` is validated for zero but `CAIRN_CACHE_MIN_AGE` is not, so `CAIRN_CACHE_MIN_AGE=0` silently disables the grace period that operations.md presents as protecting a package… CAIRN_SWEEP_INTERVAL` is validated for zero but `CAIRN_CACHE_MIN_AGE` is not, so `CAIRN_CACHE_MIN_AGE=0` silently disables the grace period that operations.md presents as protecting a package between pipeline jobs.

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 ·