Session summary

default

scored

afi / afi · cli reviewed proxy at 9b51f95e with Default profile / Anthropic · sonnet 5 high on afi 0.30.0

Measurements

Unavailable values retain their exported state and reason

Quality

Recall 15%
Model-judged precision N/A
F1 N/A
Tier 1 recall 33.3%
Tier 2 recall 14.3%
Tier 3 recall 16.7%
Tier 4 recall 0%
Security recall 0%
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 3
Defects missed 17
Findings 3
Unkeyed findings 0
Intended findings 0
Carried findings Not recorded

Cost, usage, and speed

Total bill $0.9403
Review bill $0.9403
Judge bill N/A
Tokens 336909
Duration 5m 21s

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 / 9e4eff5e45f8
Configuration ID
config-0fac4d008d696fd2
Build
afi 0.30.0 / b0f313c0b59a66ecc7612396dc8db0ea5da13a7a
Comparison
comparison-9b0e1ce26d2e951b
Build ID
build-33906dcd701a0660
Cohort ID
cohort-07363c4dd57b37b6
Harness
bench 1 / 631c4107752a97104719622800c9815e030613cf dirty
Adapter
afi 1 / sha256:a1a935298956020ee6d767a756847abb4c00694c88c2eb80d454886ebc4acf8c
Exit code
0
Wall time
321
Deadline exceeded
No
Budget
$8.00
Billing limit
$8.00

Usage

Normalized reviewer-tool usage projection

Input tokens
334869
Output tokens
2040
Cached input
0
Reasoning tokens
25020
Requests
12
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

reclaim` calls `app.sweeper.sweep(dry_run)` directly instead of the async `Sweeper::run` (sweep.rs:82-85), so it never takes the `running` mutex that sweep.rs's own module doc (sweep.rs:11-13) says… reclaim` calls `app.sweeper.sweep(dry_run)` directly instead of the async `Sweeper::run` (sweep.rs:82-85), so it never takes the `running` mutex that sweep.rs's own module doc (sweep.rs:11-13) says is required: "Two of them over one directory would each decide what to remove from a total the other is already changing... they would take the store far below the ceiling either was aiming at." A `POST /v1/admin/cache/sweep` that lands while the periodic sweep (main.rs:116, which does use `run()`) is in flight, or two concurrent admin requests, run two unsynchronized sweeps over the same directory concurrently, defeating the exact invariant the code is built around.

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 f2

bug

candidates.sort_by_key(|candidate| candidate.age)` sorts ascending, i.e. newest (smallest age) first, but the comment directly above (lines 100-101) and the documentation added in… candidates.sort_by_key(|candidate| candidate.age)` sorts ascending, i.e. newest (smallest age) first, but the comment directly above (lines 100-101) and the documentation added in docs/architecture.md:55 and docs/operations.md both state the sweep "removes the oldest blobs" to reclaim space. Since the loop never breaks and removes for the capacity reason in list order, once several blobs are past `min_age` the sweep evicts the ones that *just* crossed the grace period first and leaves genuinely ancient blobs cached longest - the opposite of the advertised LRU-style eviction, causing needless refetch churn on blobs that are merely old-enough while truly stale blobs sit untouched.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:102

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 1 (locality)
Finding f3

bug

values()` returns `sweep_bytes_reclaimed` at index 4 and `sweep_blobs_removed` at index 5, but `COUNTERS` (metrics.rs:50-57) lists `cairn_proxy_sweep_blobs_removed_total` at index 4 and… values()` returns `sweep_bytes_reclaimed` at index 4 and `sweep_blobs_removed` at index 5, but `COUNTERS` (metrics.rs:50-57) lists `cairn_proxy_sweep_blobs_removed_total` at index 4 and `cairn_proxy_sweep_bytes_reclaimed_total` at index 5. `render()` zips the two arrays positionally, so the exposed Prometheus metrics are swapped: the "blobs removed" metric reports byte counts and the "bytes reclaimed" metric reports blob counts, silently breaking the exact `cairn_proxy_sweep_bytes_reclaimed_total` alerting the PR's own docs/operations.md change tells operators to watch.

bug
Category: bug Confidence: Not recorded

services/proxy/src/metrics.rs:94

Evidence quote

Not recorded

Suggested fix

Not recorded

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