Skip to content

feat(reviewers): per-reviewer throughput and turnaround report#451

Open
boskodev790 wants to merge 1 commit into
vouchdev:testfrom
boskodev790:feat/reviewer-throughput
Open

feat(reviewers): per-reviewer throughput and turnaround report#451
boskodev790 wants to merge 1 commit into
vouchdev:testfrom
boskodev790:feat/reviewer-throughput

Conversation

@boskodev790

Copy link
Copy Markdown

what

vouch reviewers — a read-only throughput report keyed on the human at the
gate.

vouch stats buckets the review queue by the proposing agent (proposed_by)
and vouch digest lists recent decisions one at a time. neither answers "who
is doing the reviewing, and how" — the decided_by axis. this reports, per
reviewer:

  • decisions, split into approved vs rejected, and the approval rate
  • turnaround — how long proposals waited from proposed_at to decided_at,
    as median and max

an auto-expiry is not a review decision — a proposal that ages out is closed by
the vouch-expire actor, not a human — so expiries are excluded from every
reviewer's counts and reported once, separately, as expired_total (same
EXPIRE_REASON convention stats uses). clock-skew decisions (decided before
proposed) still count but contribute no turnaround sample.

why

on a team with more than one human at the gate, this is the "who's carrying the
review load, who's the bottleneck, who rubber-stamps" view — none of which the
by-proposer surfaces show. safe from cron via --since / --format json.

surface

strictly a viewport. composes store.list_proposals; writes nothing, logs no
audit event, never touches a proposal. cli-only, so no new kb.* method (the
four-site method surface and test_capabilities are untouched). no storage,
model, migration, or on-disk-layout change.

  • src/vouch/reviewers.py — new module: pure build() plus text / markdown /
    json renderers with a stable to_dict() json contract
  • src/vouch/cli.pyvouch reviewers, next to vouch digest
  • tests/test_reviewers.py — 10 tests (per-reviewer counts + approval rate,
    expiry exclusion, turnaround, --since window, unknown-reviewer fallback,
    clock-skew drop, and the cli)
  • CHANGELOG.md[Unreleased]

example

reviewer throughput @ 2026-07-10T09:00:00+00:00  (window since: 30d)
reviewers: 2  decisions: 34  expired (excluded): 3

  alice  22 decision(s)  19 approved / 3 rejected  approval 86%  turnaround med 2.4h / max 41h
  bob    12 decision(s)  8 approved / 4 rejected  approval 67%  turnaround med 6.1h / max 88h

validation

  • python -m pytest tests/ -q --ignore=tests/embeddings → 1098 passed, 37 skipped
  • python -m mypy src → clean
  • python -m ruff check src tests → clean

no linked issue — a self-contained read-only viewport that changes neither the
object model, the kb.* surface, the on-disk layout, the bundle format, nor
the audit shape, so per contributing it doesn't need a vep. glad to file one if
you'd prefer to track it.

`vouch stats` buckets the review queue by the proposing agent and `vouch
digest` lists decisions one at a time; neither aggregates by the human at
the gate.

`vouch reviewers` reports, per `decided_by` actor, how many proposals they
approved versus rejected, their approval rate, and the turnaround from
`proposed_at` to `decided_at` (median and max). an auto-expiry is a system
action, not a review, so expiries are excluded from reviewer counts and
reported once as `expired_total`.

strictly a viewport: composes store.list_proposals, writes nothing, logs no
audit event. cli-only, no kb.* method surface. adds src/vouch/reviewers.py
and tests/test_reviewers.py (10 tests).
@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 118a1d52-6b3c-41e6-b743-3ea3e9fba89c

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added docs documentation, specs, examples, and repo guidance cli command line interface tests tests and fixtures size: M 200-499 changed non-doc lines labels Jul 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cli command line interface docs documentation, specs, examples, and repo guidance size: M 200-499 changed non-doc lines tests tests and fixtures

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant