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 20%
Model-judged precision N/A
F1 N/A
Tier 1 recall 33.3%
Tier 2 recall 14.3%
Tier 3 recall 33.3%
Tier 4 recall 0%
Security recall 0%
Defect recall 23.1%
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.5133
Review bill $0.5133
Judge bill N/A
Tokens 119880
Duration 5m 1s

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
301
Deadline exceeded
No
Budget
$8.00
Billing limit
$8.00

Usage

Normalized reviewer-tool usage projection

Input tokens
118133
Output tokens
1747
Cached input
0
Reasoning tokens
25955
Requests
4
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

candidates.sort_by_key(|candidate| candidate.age)` sorts ascending, so the smallest `age` (most recently modified, i.e. newest) blob is first and the largest `age` (oldest, longest-unwanted) blob is… candidates.sort_by_key(|candidate| candidate.age)` sorts ascending, so the smallest `age` (most recently modified, i.e. newest) blob is first and the largest `age` (oldest, longest-unwanted) blob is last. The removal loop that follows walks the vector front-to-back and stops once `remaining < self.max_bytes`, so it evicts the *newest* blobs first and leaves the truly stale ones in place until every newer blob has already gone — the opposite of the "oldest blobs go, this morning's fetch stays" behaviour the comment above it and `docs/operations.md`/`docs/architecture.md` describe. Fix by sorting oldest-first, e.g. `sort_by_key(|c| std::cmp::Reverse(c.age))`.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:102

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 1 (locality)
Finding f2

bug

forget(&index, &gone)` runs unconditionally, even when `dry_run` is true. `gone` is populated for every candidate that satisfied the `remove` condition regardless of `dry_run` (the file removal itself is the only thing gated on `!dry_run`, at line 125), so a dry run actually deletes the on-disk index-entry files for those digests via `fs::remove_file` inside `forget`. This contradicts the documented contract that `?dry_run=true` "reports what a sweep would reclaim without removing anything" (docs/operations.md, routes/admin.rs:58-60) — a preview call leaves the store's index mutated.

bug
Category: bug Confidence: Not recorded

services/proxy/src/sweep.rs:140

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 12 (locality)
Finding f3

bug

The order of `values()` (`sweep_bytes_reclaimed` then `sweep_blobs_removed`) does not match the order of `COUNTERS` (`cairn_proxy_sweep_blobs_removed_total` then… The order of `values()` (`sweep_bytes_reclaimed` then `sweep_blobs_removed`) does not match the order of `COUNTERS` (`cairn_proxy_sweep_blobs_removed_total` then `cairn_proxy_sweep_bytes_reclaimed_total`, metrics.rs:50-57), so `render()` zips them and prints the bytes-reclaimed value under the `..._blobs_removed_total` name and the blobs-removed value under `..._bytes_reclaimed_total`. This is exactly the mistake the adjacent doc comment ("Keeping the two side by side is what stops a fifth counter from being rendered under a fourth one's name") warns against, and it breaks the alert `docs/operations.md` tells operators to watch (`cairn_proxy_sweep_bytes_reclaimed_total`), since that metric will actually be a blob count.

bug
Category: bug Confidence: Not recorded

services/proxy/src/metrics.rs:94

Evidence quote

Not recorded

Suggested fix

Not recorded

matchedDefect 13 (locality)
Finding f4

bug

The on-demand sweep route calls `app.sweeper.sweep(dry_run)` directly instead of `app.sweeper.run()`, bypassing the `running: Mutex<()>` in `Sweeper` (services/proxy/src/sweep.rs:67,82-85) that the… The on-demand sweep route calls `app.sweeper.sweep(dry_run)` directly instead of `app.sweeper.run()`, bypassing the `running: Mutex<()>` in `Sweeper` (services/proxy/src/sweep.rs:67,82-85) that the module's own doc comment (sweep.rs:10-12) says exists to guarantee "one sweep at a time." A request to `POST /v1/admin/cache/sweep` while the background interval sweep (main.rs:116, via `Sweeper::run`) is in flight runs concurrently against the same directory, which per the module's own reasoning can "take the store far below the ceiling either was aiming at."

bug
Category: bug Confidence: Not recorded

services/proxy/src/routes/admin.rs:76

Evidence quote

Not recorded

Suggested fix

Not recorded

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