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 overdetectors[];0.0reads "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
- The ensemble is assembled from
--detectorsor from which API keys are set (credential boundary). - All detectors score concurrently; each obeys its own rate limit, cache, and retry policy.
- 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;
--detectorspins 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.