Session summary

default

scored

afi / afi · cli reviewed proxy at 9b51f95e with Default profile / Z.AI · glm 5.2 high on afi 0.30.0

Measurements

Unavailable values retain their exported state and reason

Quality

Recall 20%
Model-judged precision N/A
F1 N/A
Tier 1 recall 0%
Tier 2 recall 28.6%
Tier 3 recall 33.3%
Tier 4 recall 0%
Security recall 50%
Defect recall 15.4%
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 4
Defects missed 16
Findings 4
Unkeyed findings 0
Intended findings 0
Carried findings Not recorded

Cost, usage, and speed

Total bill $0.1377
Review bill $0.1377
Judge bill N/A
Tokens 30993
Duration 1m 10s

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 / 39fb05463232
Configuration ID
config-2e675e005d5c9c60
Build
afi 0.30.0 / b0f313c0b59a66ecc7612396dc8db0ea5da13a7a
Comparison
comparison-091a12983a62a829
Build ID
build-4ceb7cbd44e9619b
Cohort ID
cohort-3b7bd95c9526de2e
Harness
bench 1 / 10b3b2068100b7ba429855e062500eaf83b90120 dirty
Adapter
afi 1 / sha256:a1a935298956020ee6d767a756847abb4c00694c88c2eb80d454886ebc4acf8c
Exit code
0
Wall time
70
Deadline exceeded
No
Budget
$2.00
Billing limit
$2.00

Usage

Normalized reviewer-tool usage projection

Input tokens
30269
Output tokens
724
Cached input
160896
Reasoning tokens
11424
Requests
7
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

forget(&index, &gone)` runs unconditionally, so a `dry_run=true` sweep deletes the index entries for every referenced blob it marks for age eviction even though the blob bytes are left in place. `dry_run` is documented (docs/architecture.md, operations.md) as reporting what a sweep would reclaim "without removing anything"; instead it orphans blobs, forcing refetches and leaving the bytes to be deleted by the next real sweep.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:140

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 12 (locality)
Finding f2

bug

the on-demand route calls `app.sweeper.sweep(dry_run)` directly, bypassing the `running` `Mutex` that only `Sweeper::run` (sweep.rs:82-84) acquires. Two concurrent sweep requests — or a sweep request racing the background tick — both walk the same total and both remove the oldest blobs, taking the store well below the ceiling, the exact over-eviction the module's "one sweep at a time" promise (sweep.rs:10-12) exists to prevent.

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 f3

bug

fs::metadata` follows symlinks and returns the *target's* size, contradicting the comment on lines 160-163 which claims a link is counted at the size of the link. For a store whose blobs are symlinked in (the "often" case the comment names), `held` and `bytes` are inflated by the target size, so the ceiling accounting and the reclaimed-bytes counter are both wrong; `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 f4

performance

run` is `async` but calls the fully synchronous `sweep`, which does `readdir`/`read`/`remove_file` across tens of thousands of leaf directories directly on the tokio worker thread (the route at… run` is `async` but calls the fully synchronous `sweep`, which does `readdir`/`read`/`remove_file` across tens of thousands of leaf directories directly on the tokio worker thread (the route at admin.rs:76 does the same). A sweep the code itself says can take longer than ten seconds blocks an executor worker for that whole span, stalling every other request pinned to it; the synchronous walk belongs in `spawn_blocking`.

performance
Category: performance Confidence: Not recorded

services/proxy/src/sweep.rs:84

Evidence quote

Not recorded

Suggested fix

Not recorded

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