reviews
spanical reviews measures the contribution that never shows up in line
counts: reviews given, how fast they landed, and whether merged work gets
looked at by anyone other than its author. It shares the ticket layer's sync
and preconditions with tickets.
spanical reviews [flags]Options
| Option | Values | Notes |
|---|---|---|
| All global flags | See global flags |
--period is accepted here but changes nothing: reviews are window-level
aggregates. Only tickets rejects it.
Requirements
Same as tickets: a tickets section in spanical.config.ts and
GITHUB_TOKEN exported. Missing either fails before any work with the same
messages as tickets.
Output
A Review load table per dev: Author, Reviews given (signal), Review
latency h (signal), Latency basis (context). The latency basis line
spells out which clock each sample used, like 3 requested, 1 created, 25% fallback: requested clocks start at a review-request event, created clocks
fall back to the pull request's opening, and the two measure different
things, which is why the mix is always shown next to the median.
Then a team line (Team: <n> reviews given · review latency <x>h median · latency basis <mix>), then the coverage line:
Review coverage: 6 of 7 merged pull request(s) carry a review (86%). 3 further pull request(s) opened in this window have not merged and sit outside coverage entirely.
Coverage counts only merged pull requests, because a merged one's review
history is final while an open one can still be reviewed tomorrow; the
unmerged remainder is reported so the population left out stays visible. When
nothing merged: Review coverage: no pull request merged in this window, so coverage has nothing to measure.
Three fixed caveats always follow the numbers:
- Review counts are distinct pull requests; self-reviews are excluded everywhere, and bot reviews stay in team counts but out of latency medians
- Latency takes one sample per request cycle, on the requested or created clock
- Coverage is measured over merged pull requests only
Conditional notes cover a late sync floor, unattributed reviewers, discarded
latency samples, and excluded self/pending reviews. Empty window:
No reviews cached for <window> in <repos> — no pull request was merged in this window and no review counted in it.
Example
Values are illustrative. The CLI renders bordered tables; run
spanical reviews --format md for pipe-table output:
$ spanical reviews --last 3m --format md
Review load
| Author | Reviews given | Review latency h | Latency basis |
| --- | ---: | ---: | --- |
| dev-one | 4 | 3.1 | 4 requested, 0 created, 0% fallback |
| dev-two | 2 | 9.4 | 1 requested, 1 created, 50% fallback |
Team: 7 reviews given · review latency 4.2h median · latency basis 6 requested, 1 created, 14% fallback
Review coverage: 6 of 7 merged pull request(s) carry a review (86%). 3 further pull request(s) opened in this window have not merged and sit outside coverage entirely.
JSON example
spanical reviews --format json prints the whole aggregation object, with
the per-dev rows in devs. Values below are illustrative:
{
"coverage": {
"pullRequestsMerged": 8,
"pullRequestsReviewed": 6,
"pullRequestsUnmerged": 2,
"share": 0.75
},
"excluded": {
"selfReviews": 1,
"pendingReviews": 2
},
"lateSyncFloors": [],
"devs": [
{
"authorId": 1,
"author": "dev-one",
"reviewsGiven": 5,
"latencyMedianHours": 3.1,
"requestedSamples": 5,
"createdSamples": 0,
"fallbackShare": 0
},
{
"authorId": 2,
"author": "dev-two",
"reviewsGiven": 2,
"latencyMedianHours": 9.4,
"requestedSamples": 2,
"createdSamples": 2,
"fallbackShare": 0.5
}
],
"team": {
"reviewsGiven": 7,
"latencyMedianHours": 4.2,
"requestedSamples": 7,
"createdSamples": 2,
"fallbackShare": 0.222,
"latencySamplesDiscarded": 0
},
"unattributed": {
"reviewsGiven": 0,
"latencySamples": 0
}
}