The Wringer
The Wringer is papertowel’s system for git history humanization. While the Scrubber cleans the code, the Wringer cleans the provenance.
Overview
A perfectly clean git history—where every commit is a logical unit of work, devoid of mistakes, and applied at a steady cadence—is a strong signal of AI generation (or an obsessively clean rebase, which is similarly suspicious).
The Wringer replaces “perfect” history with “human” history.
The Core Mechanism: Worktree Drip-Feeding
Most history-humanizers attempt to rewrite the existing git log using filter-branch or rebase. This is dangerous and leaves forensic traces in the git object database.
The Wringer takes a different approach. It uses git worktrees to maintain a parallel “public” version of your project.
- Private Branch: You continue developing on your private branch, committing at “machine speed” with whatever messages you like.
- Public Worktree: The Wringer creates a separate worktree on a
publicbranch. - The Queue: It analyzes the delta between your private and public branches and builds a Replay Plan.
- The Drip: Instead of applying all changes at once, the Wringer “drips” commits into the public worktree over time, based on a Persona Profile.
The Replay Plan
When you run papertowel wring queue, the tool doesn’t just copy commits. It analyzes them to create a realistic human flow:
Session Grouping
Humans don’t commit every 5 minutes for 24 hours. They work in bursts. The Wringer groups commits into “sessions” based on temporal proximity.
Intelligent Squashing and Splitting
- Squashing: Small, related commits (e.g., fixing a typo in the same file) are squashed into a single “human” commit.
- Splitting: Massive commits that touch unrelated parts of the codebase are flagged as candidates for splitting, simulating the process of a human breaking down a large task.
Target Scheduling
Each commit in the queue is assigned a target_time. This time is calculated based on the Persona’s active hours and productivity peaks, ensuring that the public history looks like it was written by someone with a life, a timezone, and a sleep schedule.
Using the Wringer
Setup
Initialize the public worktree:
papertowel wring init --branch public
Planning
Analyze your dev branch and build the replay queue:
papertowel wring queue --from dev
Execution
Start the drip-feed process. You can run it as a one-off or as a daemon that applies commits as their target_time arrives:
papertowel wring drip --daemon --profile night-owl
Status
Check the current progress of the drip-feed:
papertowel wring status
Lock Recovery
Safely remove a stale drip lock file on demand (it will not remove an active lock):
papertowel wring unlock-stale