On this page
Runbook
Start from the first Error: line. Skryba exits 1 on every failure and preserves underlying causes below Caused by:.
No detector can run
no detector credentials found; configure GPTZERO_API_KEY, WINSTON_API_KEY, ORIGINALITY_API_KEY, or SAPLING_API_KEY
Set at least one non-empty key, or in Desktop put it in ~/.config/skryba/env and relaunch. If a specific list is required, put global --detectors before the subcommand.
--detectors must contain at least one detector name — remove an empty explicit list or supply names.
unknown detector "…"; available detectors: gptzero, originality, sapling, winston — correct the name.
<KEY> is required for <name> — an explicitly selected detector lacks its key.
Detector request or response failed
<name> request failed after retries — network/DNS/TLS connection failed after retries. Inspect the cause chain and configured *_API_URL.
<name> returned <status>: <body> — the provider rejected the request, rate-limited beyond retries, or remained unavailable. For 429/5xx, Skryba already retried; do not tight-loop.
<name> returned invalid JSON or response has no recognized probability in [0, 1] — provider response shape changed. Preserve the bounded response body and selected endpoint when reporting.
<name> cannot score empty text — provide non-whitespace input.
Cache failed
creating detector cache directory <path> — parent path cannot be created; fix ownership or select a writable --cache.
opening detector cache <path> — the file is unavailable, locked incompatibly, or corrupt. Preserve it before replacement if billing evidence matters.
detector cache lock poisoned — restart the process; a previous in-process panic poisoned the mutex.
Do not delete a cache casually: subsequent identical texts will be billed again.
Brama inference failed
BRAMA_TOKEN is required for Brama inference — set a non-empty client token.
SKRYBA_AGENT_ID and SKRYBA_AGENT_AUTH_SECRET must be configured together — set both or neither.
Brama request failed after retries — inspect reachability and BRAMA_URL.
Brama returned <status>: <body> — authentication, routing, model, or service failure returned by Brama.
invalid Brama JSON, Brama returned no message content, or Brama response was truncated at max_tokens — the completion is unusable; preserve the error and model name.
Rewrite or judge refused locally
input text cannot be emptycandidate count must be positivemaximum words per chunk must be positivetemperature must be between 0 and 2minimum quality must be between 0 and 1
Correct the named value. Desktop controls already constrain candidates 1–32, chunk size 50–2,000, temperature 0.1–1.5, and quality 0.5–1.0.
quality judge failed to return a valid evaluation after three attempts — all three Brama replies failed JSON-boundary, schema, or [0,1] score validation. The nested cause says which.
Policy or training failed
reading policy <path> / parsing policy <path> — file missing, unreadable, or invalid JSON.
unsupported policy version …, policy vectors do not match the strategy count, policy contains a non-finite value — the policy is incompatible or corrupt; use a known version-1 file.
training requires at least one epoch and two generations per group — use --epochs >= 1 and --generations >= 2.
training reward weights and penalty are invalid — weights and penalty must be non-negative and detector plus quality weight must be positive.
unsupported training data extension "…"; use .json, .jsonl, or .txt — change the format or extension.
JSON training data must be an array, training row must be a string or object, training row has no non-empty text field, training data contains no text examples — correct the shape documented in train.
writing policy … / publishing policy … — make the output parent writable; check for a sibling .json.tmp left before rename.
Corpus and benchmark
curated corpus <path> contains no samples, curated sample <id> carries no text, or declared word/SHA mismatch — regenerate declarations from exact UTF-8 input; do not edit only the checksum to hide an accidental content change.
benchmark needs --corpus or at least one documentation root — supply one mode.
benchmark accepts either --corpus or documentation roots, never both — choose one.
benchmark sample and candidate counts must be positive, benchmark word bounds are invalid, or no qualifying passages found — correct numeric bounds or provide Markdown files with qualifying prose.
RentAHuman refused before network
Credential and URL:
RENTAHUMAN_API_KEY is required for RentAHumanRENTAHUMAN_API_KEY contains invalid charactersRENTAHUMAN_API_URL is not a valid URLRENTAHUMAN_API_URL must be an HTTPS base URL without credentials, query, or fragment
Request validation:
source text must contain 1 to 100000 charactersturnaround minutes must be between 5 and 10080price cents must be between 300 and 100000000idempotency key must contain 8 to 128 bytesidempotency key cannot contain control charactersapplicant screening source text cannot be emptyapplicant screening percentage must be between 1 and 25applicant screening maximum words must be between 50 and 500language requirement cannot be empty--language and --minimum-proficiency must be configured together--screening-instructions-file requires --applicant-sample-filehumanization id contains invalid characters
Correct locally and rerun with the same idempotency key. RentAHuman returned <status>: <message> is an API refusal. RentAHuman request failed after retries is transport failure; retry the same create key. RentAHuman returned invalid JSON means no trustworthy order envelope was available—preserve the response context before retrying.
Maintained as part of the website-owned Skryba documentation corpus.