Skip to content

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.

bash
spanical reviews [flags]

Options

OptionValuesNotes
All global flagsSee 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:

shell
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:

shell
$ 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:

json
{
    "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
    }
}