rabbit-writes / voice-setup
CLAUDE.md0 starsChanged 2 months agoMITView on GitHub
Skill for building, measuring, editing, and switching personal writing voice profiles used by the rabbit-writes engine.
In this repository13 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- skills/rabbit-agents-md/CLAUDE.mdCLAUDE.md
- skills/rabbit-readme-improver/CLAUDE.mdCLAUDE.md
- skills/rabbit-reads/CLAUDE.mdCLAUDE.md
- skills/rabbit-rewrites/CLAUDE.mdCLAUDE.md
- skills/rabbit-writes/CLAUDE.mdCLAUDE.md
- rabbit-agents-mdSkill
- rabbit-readme-improverSkill
- rabbit-readsSkill
- rabbit-rewritesSkill
- rabbit-writesSkill
- voice-setupSkill
The file
Files
voice-setup
Skill for building, measuring, editing, and switching personal writing voice profiles used by the rabbit-writes engine.
Commands
# Measure writing samples & generate steganographic/stylometric distributions
python3 skills/voice-setup/scripts/measure_voice.py sample1.md sample2.md sample3.md
# Measure samples and output JSON
python3 skills/voice-setup/scripts/measure_voice.py sample1.md sample2.md --json
# Measure samples, then print the interview they could not answer (route 3)
python3 skills/voice-setup/scripts/measure_voice.py sample1.md sample2.md --questions
# Measure samples and write a fingerprint file
python3 skills/voice-setup/scripts/measure_voice.py sample1.md sample2.md --name <voice> --write-fingerprint
# Scaffold a new voice profile
python3 skills/voice-setup/scripts/build_voice.py --scaffold --name <name>
# Check validity of a voice profile
python3 skills/voice-setup/scripts/build_voice.py --check <name>
# Activate a voice profile (sets skills/rabbit-writes/voices/ACTIVE)
python3 skills/voice-setup/scripts/build_voice.py --check <name> --activate
# Learn rules from a converted/edited diff pair
python3 skills/voice-setup/scripts/learn_edits.py converted.md edited.md
# Audit a finished profile against the writer's own corpus
python3 skills/voice-setup/scripts/audit_voice.py <voice> sample1.md sample2.mdStructure & Architecture
SKILL.md: Frontmatter and workflows for voice creation (Taste Interviewer protocol, sample measurement, profile editing/blending).scripts/:measure_voice.py: Analyzes sample text files for stylometric markers, distributions, sentence lengths, and checks samples for AI contamination (P0 fingerprints). Generates starter JSON mechanics and fingerprint files.build_voice.py: Scaffolds voice templates, validates profile syntax and mechanical completeness viarwlib.voice_check, and activates specified voices inskills/rabbit-writes/voices/ACTIVE.learn_edits.py: Extracts style diffs and banned phrases from before/after text revisions.audit_voice.py: Runs a finished profile over the writer's own corpus and reports which rules fire on the prose they came from (fire-backs, exit 1), per-sample fingerprint distance with a scale-vs-register reading, the one-register-or-two shape receipt (which needs no fingerprint and is printed without one), engine P0 tells as Known contamination candidates (thesafetyband excluded, since it is unsuppressible by design), and cap suggestions measured with the engine's own yardstick. Nothing is written. An out-of-range distance is read against the fingerprint's stored sample sizes first, because a corpus half the calibration size reads far whatever register it is in, and scale and register call for different fixes. It resolves the register beforestylometry.path_for, offregisters.default_register(), the same defaultscan.pypasses: askingpath_forwithNoneskips the register-scoped file, so a profile carrying only<name>.blog.fingerprint.jsonused to report no fingerprint here whilescan.pymeasured the same document against it. Every number a suggestion carries is measured with the engine's own yardstick, over the exempted copyscan()already built:is_prose_blockfor the paragraph cap (a six-item bullet list otherwise reads as one 24-sentence paragraph) andstats["word_count"]for a signature rate.thesaurus.json: Versioned reach/overreach word families behind the measured thesaurus inmeasure_voice.py. Each family pairs a plain word with the dressed-up synonyms a sample set may reach past, and a family where the samples attest the plain word only becomes apreferred_substitutionsproposal. Shape rules live inthesaurus_check.pybeside it, with three consumers that must not disagree:scripts/validate.py, the research pipeline's04_merge_accepted.py, and this skill's owntests/test_thesaurus.py. A family edit requires aversionbump. Families grow throughscripts/thesaurus-research/at the repo root, not by hand-pasting generated entries. The dataset URLs, pinned hashes, and every generation threshold live inscripts/thesaurus-research/thesaurus_io.py, one home each.
- Target Profiles (
skills/rabbit-writes/voices/):<name>.md: Human-readable profile describing voice, structure, tone, and hard refusals.<name>.rules.json: Machine-enforceable regex rules, banned words/phrases, and mechanics.<name>.fingerprint.json: Stylometric baseline data for measuring distance.
Conventions & Gotchas
- P0 Contamination Check:
measure_voice.pychecks input samples for P0 contamination (chatbot artifacts, cutoff disclaimers, hidden unicode). If detected, it exits with code 1 to prevent writing AI artifacts into a human voice profile. - Profile Pair Integrity: A voice profile consists of both
.mdand.rules.jsoninskills/rabbit-writes/voices/.build_voice.py --checkensures no scaffold prompts (<angle brackets>) remain before allowing activation. - Voice Validation:
build_voice.py --checkusesrwlib.voice_checkfromskills/rabbit-writes/scripts, sharing rule validation logic withscripts/validate.py. - Tests:
tests/run.pyis a zero-dependency runner overtests/test_voice_setup.py,tests/test_thesaurus.py, andtests/test_audit_voice.py. CI runs it, so a thesaurus family that breaks a proposal fails the build rather than a hand-run. - Audit exit semantics:
audit_voice.pyexits 1 when a profile rule fires on the writer's own prose.voice-distanceandvoice-oxford-commaare exempt (a measurement, and an advisory no regex settles), and everything else counts whatever its priority: a stated rule the writer's own prose breaks is a disagreement even when it enforces at P2. Pass whole documents, not chunks, because per-document caps and the reliability floor dilute over split files. - A ban list entry is escaped whole, so
word_regexmatches a multi-wordbanned_wordsentry fine. The only real difference between the two lists is thatphrase_regexlets whitespace flex across a line break. The entry that never fires is one pasted in with its markdown still on it (`synergy`), becauseapply_exemptionsblanks the code span before any ban is applied. That is the casebuild_voice.py --checkreports as DEAD, and it is most of why the live-fire probe earns its cost. - A fresh scaffold fails its own
--check, on purpose.build_voice.py --scaffoldstrips the template's guidance keys and itsexample-ruleentry, and deliberately leaves the<angle bracket>prompts in the markdown, because they are the form. The failing check is the to-do list, and--activaterefuses until somebody fills it in. - Thesaurus candidates regenerate:
python3 scripts/thesaurus-research/01_fetch_datasets.py(network, one-shot), thenpython3 scripts/thesaurus-research/02_generate_candidates.pyandpython3 scripts/thesaurus-research/03_corpus_evidence.py. A human editsstatusfields indocs/thesaurus-research/candidates.json, andpython3 scripts/thesaurus-research/04_merge_accepted.pywrites the shipped file and bumps its version. Regeneration carries review forward, so rerunning 02 never loses an accepted or rejected mark.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

