On this page

Writing-style learning

Skryba collects prose you wrote, asks you to write or rewrite more, trains an adapter through Ster and measures its voice on later authored prose. A passage count is evidence of coverage, not evidence that a model sounds like you. The result of a blind comparison is a measurement for the exact adapter and test set, not a universal “style learned” percentage.

Collect work continuously

Register only sources that hold your own words. A source has its own cursor, provenance and word bounds. harvest run reads each source incrementally; Stado can run all registered harvesters on the explicit cron, time zone and host you choose. work next returns an already pending assignment without rerunning a source: an unavailable source cannot hide a task you can finish. When no assignment is pending, it runs all registered harvesters before selecting new work. Duplicate passages are keyed by their text. A failed source is named with its operation and cause after other sources have added what they could; no new assignment is reported as successful on a partial refresh. See harvesters for kinds, registration, schedule and cursor diagnostics.

skryba writing-style harvest add <NAME> --kind files --path <AUTHORED_FOLDER> --min-words <N> --max-words <N>
skryba writing-style harvest schedule set --cron <CRON> --tz <ZONE> --host <STADO_HOST>
skryba writing-style harvest run
skryba writing-style harvest list

Named files need no model to read. A folder asks Brama's decision-model to choose include or skip for each entry in one typed decision request, then descends only into chosen folders. A direct OpenAI-compatible service uses its declared chat model and must return the documented JSON selection. Messages, Notes and transcript harvesters keep only the author's side by their source-specific boundary; machine responses must never enter passages as authored prose.

Next work

skryba writing-style work next --kind write [--temperature <T>]
skryba writing-style work next --kind rewrite [--temperature <T>]
skryba writing-style work list
skryba writing-style work show <ID>
skryba writing-style work submit <ID> --text <FILE|->
skryba writing-style work skip <ID>
skryba writing-style work resume <ID>

next returns the oldest pending task of that kind without refreshing sources. Otherwise it refreshes them and takes an unused authored seed. For write, the selected chat model gives a topic, audience and purpose without copying the author's wording. For rewrite, an existing pending model sample for that seed is reused or the selected chat model writes one on the same subject and at the seed's length. The author's reference is data, not instructions. The generated brief and model text are never recorded as authored passages. Folder selection on a Brama route needs --brama-url/BRAMA_URL and BRAMA_TOKEN_ROLE; its decision alias is separate from the chat model. Generating a new brief or sample additionally needs --model/SKRYBA_MODEL for chat. A direct model service needs its own URL, bearer file and chat model for both operations. Missing chat model is refused before generation; no assignment is saved. --temperature is passed through when given; Skryba invents no sampling value when it is omitted.

Assignments have an id, kind, seed, prompt, optional model passage, state and response in the fleet database. submit reads UTF-8 from a file or stdin, not from argv. Original writing adds one authored passage with source work:<ID>; a rewrite keeps a preference between the user's words and the model text, linked to the sample. The response and authored material commit together; if another submit or skip wins first, the losing answer is refused without adding a passage or pair. skip sets pending work aside; resume makes it pending again. A completed seed is not repeatedly assigned. When no unused seed exists, collect more work or resume a skipped assignment; no arbitrary quota is fabricated.

A practical sequence is to register a folder of your drafts, request write, open the returned prompt, write in a file, submit its id and file, then request rewrite and replace the displayed machine text in your own words. work list, writing-style sources and writing-style pairs inspect what survived, rather than relying on a successful command alone.

Train and preserve provenance

skryba writing-style train --method sft --model <CHECKPOINT> --output <ADAPTER>
    --device <DEVICE> --precision <PRECISION> --rank <N> --alpha <A>
    --epochs <N> --learning-rate <F> --accumulation <N>
    --max-sequence <TOKENS> --batch-size <N> --seed <SEED> --lead-words <N>

--method dpo --beta <B> trains on author-resolved rewrite pairs instead of SFT passages; --beta is refused for SFT. --revision pins a Hugging Face checkpoint, --export names the retained training JSON, --name labels it, and --limit uses the oldest rows. Without --export, the JSON is kept beside the adapter as <stem>-sft.json or <stem>-dpo.json. The SFT lead is a sentence-bounded opening of the author's own text; DPO has no lead prompt. Ster maps the checkpoint and owns the gradient. The required numeric flags come from the caller, not Skryba; Ster owns its remaining tune controls.

The exact command and Ster's stderr are shown while it runs. Only after Ster succeeds and writes an adapter does Skryba retain its SHA-256 content digest, base checkpoint and revision, method, export digest, record count, training text membership and the last passage sequence at completion. Material imported during training is conservatively excluded from future evaluation. A path with the same name but different adapter bytes is not the same model. progress reports this provenance; an older adapter without it is refused rather than retroactively declared trained.

Measure voice on genuinely unseen writing

Import or write additional authored passages after training, then run:

skryba --brama-url <BRAMA_URL> writing-style evaluate
    --adapter <ADAPTER> --device <DEVICE> --precision <PRECISION>
    --chat-template <TEMPLATE> --max-new-tokens <TOKENS>
    --lead-words <N> --limit <PASSAGES> --temperature <T> --seed <SEED>
skryba writing-style progress
skryba writing-style progress --evaluation <ID>

The local checkpoint and adapter receive the same sentence-bounded opening and generation settings. On a Brama route, decision-model answers a typed choice question with exactly A, B or TIE; the global chat --model does not choose this judge. A direct model service instead requires --model <JUDGE_MODEL> and must answer those labels through chat completion. The judge sees the held-out author continuation and both generated alternatives with A/B order alternated, comparing rhythm, diction, register and structure. Identical generations count as a tie without spending a judge call; their judge_answer is null, not a fabricated model verdict. For a judged example the field holds the returned A, B or TIE. A detector's AI probability is not a voice score. Skryba stores the reference, opening, both outputs, winner, model identities and exact adapter digest for every example. The report counts adapter wins, base wins and ties, plus passages too short to split. Inspect the examples: a win count without them would conceal content drift or a weak judge. No percentage is asserted from corpus volume.

progress lists passages and words by source kind, pending/completed/skipped assignments, latest training and every measured run with its exact adapter digest, judge and win/tie counts. --evaluation <ID> retrieves the persisted full report and every compared passage, or refuses an unknown id with the fleet location. No model quality is claimed without a held-out evaluation. After training a newer adapter, compare its digest with the history before interpreting an older result; the score does not transfer.

Use the learned voice from an application

skryba rewrite is the shared text boundary for a paper, a message or a website draft. The caller sends UTF-8 on stdin, names its required style and language from the catalog, and receives selected text on stdout (or a JSON report). Training does not silently change an application's generator: choose the local Ster route with the exact adapter explicitly.

skryba --minimum-quality <Q> rewrite - --generator local
    --local-model <CHECKPOINT> --adapter <ADAPTER>
    --local-device <DEVICE> --local-precision <PRECISION>
    --local-chat-template <TEMPLATE> --local-max-new-tokens <TOKENS>
    --style <CATALOG_STYLE> --language <CATALOG_LANGUAGE>
    --candidates <N> --max-words-per-chunk <N> --temperature <T> --seed <SEED>

academic keeps claims and citations for a paper; message keeps speaker, addressee and details for correspondence. These are task constraints, not the author's identity. The adapter supplies a learned voice, and the held-out history says whether it actually improved on the base checkpoint. The rewrite still needs its configured Brama or direct-service judge and detector providers; an unevaluated or weak adapter is not declared to sound like the author. See rewrite for its output, report and refusal contract.

For a manuscript, Lem's paper AI text panel can select Local and the Skryba-trained adapter explicitly. Its lem-cli humanize rewrite command likewise takes --generator local --adapter <PATH> with the matching checkpoint, device, precision, chat template, token budget and common rewrite settings. Review the candidate against the paper's claims and citations before replacing the draft. The Brama route does not select your adapter implicitly. For mail, rewrite a draft with --style message --output <BODY_FILE>, inspect the file, then pass it explicitly to skrzynka --organization <ORGANIZATION> message send --mailbox <MAILBOX> --to <ADDRESS> --subject <SUBJECT> --body-file <BODY_FILE> --idempotency-key <KEY>. Keep that key for a repeated identical send; use a new key only for a new message. Skrzynka neither generates a reply nor sends one because Skryba produced text: sending is a separate provider mutation. In Skrzynka Desktop, Import Skryba rewrite… on Compose or the Inbox reply composer loads that reviewed UTF-8 file into the draft; it names an unreadable or empty file, confirms replacement of existing text, and never sends mail.

Refusals and diagnostics

  • work show or submit with an unknown id names the fleet store and points to work list; a completed or skipped task refuses another submission.
  • Empty human text and an unchanged model passage are refused. A duplicate authored passage or pair is deduplicated and the task still records the response; added says whether a new training row landed.
  • work next with no unused authored seed names the kind and store and asks for more import or resumed work. A Brama or harvester failure carries its actual request/source cause; already imported rows remain inspectable.
  • train refuses missing Ster, invalid tune parameters, an empty export, a nonzero Ster exit or a success exit without adapter bytes. A provenance recording failure is an error, not a claimed trained evaluation candidate.
  • evaluate refuses a missing adapter file, a digest without complete training provenance, no passages after its boundary, a nonpositive --lead-words, an invalid limit or temperature, a missing Ster model, empty base/adapter output, and passages too short for the declared lead. Brama's decision refusal exposes the HTTP status, alias/route cause and response; a direct service's malformed A/B/TIE answer names the held-out passage and number of completed comparisons. No partial comparison is stored as a completed run.
  • progress --evaluation refuses an unknown id and points to the history; it does not silently substitute the latest result.
  • Database creation, membership, holdout query and report persistence name the fleet location and failing operation with the underlying Postgres cause. A healthy process or configuration declaration is not proof of a completed comparison.

Desktop

Your voice has Write, Train, Progress and Evaluate beside Samples, Harvesters, Rules and Profile. Write offers next/list/show/submit/skip/resume and an editor for the returned assignment. Train selects SFT passages or DPO author-resolved pairs and takes the explicit Ster checkpoint, adapter path and tune controls; it shows the export, adapter, exact Ster command or CLI refusal. Progress shows historical comparisons and opens their full persisted evidence by id; its latest training row can fill the Evaluate adapter path. Evaluate requires the remaining explicit Ster controls and displays each reference, base and adapted output. The CLI's refusal is shown verbatim. See Your voice.

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