On this page

Score

"Score" in Skryba is always the ensemble AI probability: the unweighted mean of every configured detector's ai_probability for one text. It is what skryba score prints, what each rewrite candidate is ranked by, and what the training reward converts into 1 - ai_probability.

Shape

skryba score output (src/main.rs):

{
  "ai_probability": 0.7835,
  "detectors": [
    { "ai_probability": 0.7835, "cached": false, "detector": "sapling" }
  ]
}
  • ai_probability — mean over detectors[]; 0.0 reads "certainly human", 1.0 "certainly AI" for every provider (Winston's human score is inverted at ingestion).
  • detectors[] — the per-detector breakdown, including whether each number came from the cache.

Inside a rewrite result, the same two fields appear on every candidate (ai_probability plus its detectors[] evidence).

Lifecycle

  1. The ensemble is assembled from --detectors or from which API keys are set (credential boundary).
  2. All detectors score concurrently; each obeys its own rate limit, cache, and retry policy.
  3. The mean is computed over exactly the configured detectors — there is no weighting, dropping, or outlier handling.

Invariants

  • The score is only comparable between runs with the same detector set. Adding or removing a detector key changes the ensemble and therefore the number; --detectors pins the set explicitly.
  • One failing detector fails the whole score — Skryba never averages over a silently smaller ensemble.
  • A score never costs money twice for the same text against the same detector revision and endpoint.

Exact refusal sentences

  • no detector credentials found; configure GPTZERO_API_KEY, WINSTON_API_KEY, ORIGINALITY_API_KEY, or SAPLING_API_KEY
  • --detectors must contain at least one detector name (e.g. --detectors ,)
  • at least one detector must be configured (library-level guard on an empty ensemble)
  • <name> cannot score empty text

All were captured live in walkthrough-scoring.

Maintained as part of the website-owned Skryba documentation corpus.