On this page

What is Skryba

Skryba is a Rust CLI that generates alternative prose and selects the candidate with the lowest measured AI probability among those that pass its quality, style, and language checks. It does not guarantee a detector verdict. Generation goes through Brama or a local Ster checkpoint; detection goes through commercial detector APIs, and strategy selection uses a native GRPO policy.

Choose the style and language

skryba rewrite --style <NAME> chooses the required register and --language <NAME> independently chooses the output language; a named language translates when needed. Both default to preserve. The names are entries of the catalog, each a name and an instruction: a new catalog offers preserve, academic and message, and preserve, pl and en, and skryba style add or skryba language add offers another without a new release.

These choices apply to every candidate, not just one sampled editing strategy. They also apply when a personal adapter writes the candidates. The report keeps the resolved profile, with the instructions the run used, and each evaluation's style_matched and language_matched. Definitions, examples, and refusals are in skryba rewrite.

The generator proposes

Input text is split into chunks of at most --max-words-per-chunk words (required), on paragraph boundaries where possible. For each chunk, the GRPO policy samples one rewrite strategy per candidate (--candidates, required) from its strategy distribution. The six built-in strategies — natural-editor, plainspoken, scholarly-human, rhythmic, specific, light-touch — are editing directions. The required style and language take precedence when a direction conflicts with them. Every candidate must preserve claims, qualifications, names, numbers, citations, and logical relationships. A policy trained with skryba train changes which directions get sampled; it is not a required-style selector. Details: chunk, policy.

The scorer measures twice

Every candidate is scored on two independent axes:

  • Detectability — each configured detector (GPTZero, Winston, Originality.ai, Sapling) returns an AI probability in [0, 1]; the ensemble mean is the candidate's ai_probability. Responses are cached in the fleet database keyed by a SHA-256 of the text and the detector revision. Each score is one request, paced per detector only when --detector-interval-ms states a pause.
  • Quality and profile — a Brama judge scores meaning preservation, factual consistency, grammar, coherence, naturalness, and readability. It flags critical errors and separately checks the required style and output language. Explicit translation is judged for equivalent meaning, not identical words. A numeric score cannot excuse the wrong profile.

Details: detector, score, quality judge, cache.

The selector keeps an eligible winner

Generated candidates must pass the quality thresholds (--minimum-quality, required), have no critical error, and match both profile choices. Among survivors, the lowest ai_probability wins. If none survives, the original chunk can be kept only when it already matches the required style and language. Otherwise Skryba refuses with the chunk number, requested profile, failed checks, and judge issues, before writing the final output or report. A source fallback is marked used_source_fallback: true; it is not a claim that the original passed every numeric quality threshold. Details: rewrite.

The other half: the person's own writing

skryba writing-style holds the text the person writing actually writes and trains a LoRA adapter to write like them. add ingests their own files, keep records a pair they resolved — what they kept against what the model produced — train goes from the store to an adapter by driving Ster, export writes the training file as --format sft or --format dpo, and status reports the counts. Then skryba rewrite --generator local --local-model <checkpoint> --adapter <adapter> uses that adapter. Choosing --style academic is not adapter training: it is a requirement on the current rewrite and overrides conflicting learned phrasing.

Unlike the detector cache, the writing-style store keeps text, because a hash cannot be trained on. Nothing under writing-style needs a model-provider credential. Capture commands call no model; training calls the local ster binary. The weights stay Ster's. Details: writing-style store, training boundary, skryba writing-style.

When a machine rewrite is not enough

Skryba stops at the machine rewrite. Paying a person to rewrite, screen, or verify the text is HandToHuman's job and runs on its own marketplace ledger: price the work with handtohuman quote --kind humanization --words N --turnaround-minutes M, then use handtohuman market offer-create, order-create, order-fund, order-assign, order-deliver, order-verify, and order-accept. No Skryba command commissions a person, and Skryba holds no marketplace credential.

Boundaries

Skryba holds no direct model-provider keys. Brama owns remote model routing and inference; BRAMA_TOKEN_ROLE=ROLE#FIELD selects the client credential resolved through Stado or the explicitly selected owner-only credentials file. Secret-valued BRAMA_TOKEN is not read. Skryba runs no server and keeps no database file: detector scores, retained drafts, the style and language catalog and the writing-style store are tables of its fleet database, which Stado names and Skarbiec unlocks. Policy files and training exports are files at paths the operator names. The credential boundary explains what leaves the machine. The native app in skryba-desktop spawns this CLI and displays its results and refusals; it does not implement another rewriting engine.

Commands to start with

skryba database check
skryba score draft.txt
skryba style list
skryba --minimum-quality <Q> rewrite draft.txt --generator brama --style academic --language en \
  --candidates <N> --max-words-per-chunk <N> --temperature <T> --seed <N> --report report.json
skryba corpus tests/fixtures/humanization_samples.json --seed <N>

database check confirms the fleet database answers. Scoring requires a detector key. Listing styles needs no model credential. Rewriting also requires a Brama token and models that support the requested language, and every number it uses is yours to state. Corpus verification needs neither credentials nor network. Examples are not evidence that a particular model produces an acceptable translation: real text, judge results, and detector responses must be checked together.

Read more

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