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 showorsubmitwith an unknown id names the fleet store and points towork 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;
addedsays whether a new training row landed. work nextwith 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.trainrefuses 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.evaluaterefuses 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 malformedA/B/TIEanswer names the held-out passage and number of completed comparisons. No partial comparison is stored as a completed run.progress --evaluationrefuses 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.