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 35%
Model-judged precision N/A
F1 N/A
Tier 1 recall 33.3%
Tier 2 recall 42.9%
Tier 3 recall 33.3%
Tier 4 recall 25%
Security recall 50%
Defect recall 30.8%
Maintainability recall 0%
Performance recall 66.7%
Median anchor distance 0
Worst anchor distance 3
Refusals a judge overturned Not recorded

Review outcomes

Distinct matched defects 7
Defects missed 13
Findings 8
Unkeyed findings 1
Intended findings 0
Carried findings Not recorded

Cost, usage, and speed

Total bill $0.0120
Review bill $0.0120
Judge bill N/A
Tokens 38866
Duration 1m 42s

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

Usage

Normalized reviewer-tool usage projection

Input tokens
38367
Output tokens
499
Cached input
29952
Reasoning tokens
10591
Requests
3
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` (lines 94-95), but `COUNTERS` lists `cairn_proxy_sweep_blobs_removed_total` then `cairn_proxy_sweep_bytes_reclaimed_total` (lines… values()` returns `sweep_bytes_reclaimed` then `sweep_blobs_removed` (lines 94-95), but `COUNTERS` lists `cairn_proxy_sweep_blobs_removed_total` then `cairn_proxy_sweep_bytes_reclaimed_total` (lines 51-57) — `render()`'s zip pairs each counter with the other's name, so every scrape reports bytes under the blobs-removed metric and vice versa. `docs/operations.md` tells operators to watch `cairn_proxy_sweep_bytes_reclaimed_total`, which now shows a blob count.

bug
Category: bug Confidence: Not recorded

services/proxy/src/metrics.rs:88

Evidence quote

Not recorded

Suggested fix

Not recorded

rejectedNo keyed defect (scorer)
Finding f2

bug

reclaim` calls `app.sweeper.sweep(dry_run)` directly, bypassing the `running` mutex that only `Sweeper::run` (sweep.rs:82-85) takes. An on-demand sweep therefore runs concurrently with the background sweep, which is exactly the two-sweeps-over-one-directory hazard sweep.rs:10-12 says the type exists to prevent: both decide what to remove from a total the other is changing, over-evicting the store far below the ceiling.

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 f3

bug

the sweep handler runs `Sweeper::sweep` — a fully synchronous `std::fs` walk and unlink pass over the whole store (sweep.rs:90-149) — directly on the async runtime worker thread. A store with tens of thousands of entries blocks the executor for the whole pass, stalling every other request including `/healthz` and `/metrics`; it needs `spawn_blocking`.

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 f4

bug

forget(&index, &gone)` runs unconditionally, including on a dry run. `gone` holds every candidate the dry run *would* remove, so `?dry_run=true` — documented as reporting "without removing anything" — actually deletes the index entries for those blobs, turning live cache coordinates into misses and forcing refetches for an operator who was only trying a ceiling out.

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

clear_partials` unlinks every file in `incoming` with no age check, but `incoming` also holds the temp files of fetches in flight right now (`BlobStore::writer`, store.rs:171-180, writes there until… clear_partials` unlinks every file in `incoming` with no age check, but `incoming` also holds the temp files of fetches in flight right now (`BlobStore::writer`, store.rs:171-180, writes there until commit). A sweep that lands mid-download unlinks the temp file out from under the writer; the later `fs::rename` in `BlobWriter::commit` (store.rs:259) fails with NotFound and the client's fetch fails. Needs the same `min_age` grace the blob path has.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:230

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 17 (locality)
Finding f6

bug

fs::metadata` follows symlinks, so a symlink is counted (and recursed) at its *target's* size and type, not the link's — the opposite of what the comment at lines 160-163 claims (`symlink_metadata`… fs::metadata` follows symlinks, so a symlink is counted (and recursed) at its *target's* size and type, not the link's — the opposite of what the comment at lines 160-163 claims (`symlink_metadata` is what that needs). A symlinked directory is also recursed into, so a symlink cycle under the blob dir makes `collect` recurse until the stack blows.

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

tokio's `interval` completes its first tick immediately, so the loop sweeps straight away. The doc comment at main.rs:101-102 claims the first tick is one interval away precisely to stop a freshly started proxy from sweeping an empty cache — the stated behaviour and the actual behaviour are opposite (harmless today only because the store is empty at startup).

bug
Category: bug Confidence: Not recorded

services/proxy/src/main.rs:115

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 8 (locality)
Finding f8

bug

when `fs::remove_file` fails, the blob is still counted — `remaining` is decremented, `bytes`/`removed` incremented (lines 134-136) — and `forget` then deletes its index entries anyway. A sweep that cannot unlink (permissions, EBUSY) reports reclaimed bytes that are still on disk and leaves blobs on disk that nothing in the index can reach.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:126

Evidence quote

Not recorded

Suggested fix

Not recorded

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