prepare-paperclip-pr
Prepares a Paperclip branch for a pull request with proper commits, checks, and formatting.
Pass rate with the skill minus without, same tasks, same model.
- Content Lift forced arm
- −13pp [−50, +25]
- Trigger rate
- 100%
- Trials
- 24 · 8 tasks
- Model
- GLM-5.3-flash
- Measured
- 2026-10-15
Content Lift = the skill's instructions injected into the system prompt, so it measures what the content does once loaded, apart from whether the agent chooses to load it. Method →
Embed this score · live badge for your README
The badge shows the real benchmark number and updates itself when we re-bench — including the honest states (“did not trigger”, “not benched yet”). All badge options →
[](https://skillzbench.com/skills/prepare-paperclip-pr)[](https://skillzbench.com/skills/prepare-paperclip-pr)<a href="https://skillzbench.com/skills/prepare-paperclip-pr"><img src="https://skillzbench.com/api/badge/prepare-paperclip-pr.svg" alt="SkillzBench benchmark" height="20"></a>A/B outputs — median trial per arm
Chat harness (v2): the agent's final message without the skill (left) vs with it (right).
prepare-paperclip-pr--m1
PR Title
fix(auth): validate empty passwords on login
PR Description
## Summary
Fixes a bug where the login flow accepted empty passwords, allowing
authentication attempts with a blank password field.
## Changes
- `src/auth.py`: Add validation to reject empty (and whitespace-only) passwords
before authentication is attempted.
- `tests/test_auth.py`: Add test coverage for empty-password login attempts.
## Testing
- [x] Unit tests added for empty password input
- [ ] Full test suite passes locally
- [ ] Linting passes
## Notes
- Branch: `fix-login`
- Consider whether whitespace-only passwords should also be rejected (currently handled in this change — please confirm intended behavior).
Pre-PR Checklist
Code quality
- Run the test suite:
pytest tests/(or your project's runner) - Run linter/formatter:
ruff check ./black --check ./flake8(whatever the repo uses) - Type checking if configured:
mypy src/
Git hygiene
- Rebase onto the latest default branch (e.g.,
git fetch origin && git rebase origin/main) - Confirm only intended files are in the diff:
git diff origin/main --stat(should show onlysrc/auth.pyandtests/test_auth.py) - No debug prints, commented-out code, or leftover secrets in the diff
- Commits are clean and messages follow repo conventions (or squash before opening)
Tests
- New tests fail on the old code (verify by stashing the
src/auth.pychange) - Tests cover edge cases: empty string
"", whitespace-only" ", andNoneif applicable
Review readiness
- Link the related issue in the PR (e.g., "Fixes #123")
- Add screenshots/logs if the bug had a visible failure mode
- Request reviewers familiar with the auth module
Want me to help draft the actual validation code or the test cases?
Here's what you need for your fix-login PR:
PR Title
Fix login accepting empty passwords
PR Description
## Summary
Login previously accepted empty passwords, allowing authentication attempts
to proceed without any password value. This change adds validation so that
empty (or whitespace-only) passwords are rejected before authentication.
## Changes
- `src/auth.py`: Add validation to reject empty passwords during login.
- `tests/test_auth.py`: Add test coverage for empty-password login attempts.
## Testing
- Added/updated unit tests in `tests/test_auth.py` covering the empty-password case.
- Existing auth tests still pass.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Pre-submission checklist
- Worktree safety — confirm you're on a dedicated worktree/branch (
git branch --show-current), not the main~/paperclipcheckout. - Commit everything — both files committed with logical messages ending in
Co-Authored-By: Paperclip <noreply@paperclip.ing>. - Rebase on master — fetch the target remote and rebase
fix-loginso there are no conflicts; re-run the auth tests after. - Run the tests —
pytest tests/test_auth.py(plus the broader suite if quick) and confirm they pass. - Guardrails — no
pnpm-lock.yamlcommitted, no.github/workflows/*changes, no stray images, under 100 changed files (you're fine at 2). - Open the PR — push the branch and open against
masteronpaperclipai/paperclipwithgh, followingCONTRIBUTING.md. - Review loops — run the Greptile review loop until 5/5 with zero unresolved comments, then the
/prcheckloopfor CI/verification failures.
If you'd like, I can help draft the exact commit messages or refine the description further.
prepare-paperclip-pr--m2
Suggested commits
Commit 1 — the feature:
Add dark mode toggle to theme system
Add a dark mode toggle to src/theme.py so users can switch between
light and dark themes at runtime.
Commit 2 — persistence:
Persist dark mode setting across sessions
Update src/settings.py to save and restore the dark mode preference
so the choice survives app restarts.
Commit 3 — tests:
Add tests for dark mode toggle
Add tests/test_theme.py covering the toggle behavior and default state.
Commands:
git add src/theme.py && git commit
git add src/settings.py && git commit
git add tests/test_theme.py && git commit
git push -u origin add-dark-mode
PR body
## Summary
- Adds a dark mode toggle to the theme system (`src/theme.py`)
- Persists the user's dark mode preference across sessions (`src/settings.py`)
- Adds test coverage for the new toggle (`tests/test_theme.py`)
## Changes
| File | Change |
|---|---|
| `src/theme.py` | New dark mode toggle |
| `src/settings.py` | Save/restore dark mode setting |
| `tests/test_theme.py` | Tests for toggle behavior |
## Testing
- [x] New unit tests added and passing
- [ ] Manually verified toggle persists after restart
## Screenshots
_(add before/after screenshots of light and dark modes)_
Title suggestion: "Add dark mode toggle with persisted setting"
Here's the plan for your add-dark-mode branch:
Logical commits
Commit 1 — feature:
Add dark mode toggle to theme
Add a dark mode toggle in src/theme.py so users can switch between
light and dark themes.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Files: src/theme.py
Commit 2 — persistence:
Persist dark mode setting across sessions
Store the theme preference in src/settings.py so the chosen theme
is restored on next launch.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Files: src/settings.py
Commit 3 — tests:
Add tests for dark mode toggle and persistence
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Files: tests/test_theme.py
Suggested PR body
Title: Add dark mode toggle with persisted setting
## Summary
- Adds a dark mode toggle to the theme system (`src/theme.py`)
- Persists the user's theme choice in settings (`src/settings.py`) so it survives restarts
- Adds unit tests covering the toggle and persistence behavior
## Testing
- New tests in `tests/test_theme.py` (toggle behavior + setting persistence)
- Existing test suite passes
## Checklist
- [x] Logical commits with clear messages
- [x] Tests added/updated
- [x] No lockfile, workflow, or unrelated file changes
Before opening the PR (per the Paperclip procedure)
- Do this in a git worktree, not the main
~/paperclipcheckout. - Rebase onto the target remote's
masterand re-run the relevant tests. - Follow
CONTRIBUTING.mdfor exact title/message format, push, and open withgh. - Run the Greptile review loop until 5/5 with no unresolved comments, then the PR check loop, and record the PR URL.
prepare-paperclip-pr--m3
Here's everything you asked for:
Squashed commit message
refactor(api): migrate endpoints to new response format
- Update all API endpoints to return the new response format
- Clean up intermediate work from refactor-api branch (squashed)
(If your repo uses Conventional Commits, refactor(api): is the right prefix; otherwise the plain subject line works.)
PR description
Title: Refactor API endpoints to new response format
Body:
## Summary
Migrates the API endpoints to the new response format. This consolidates
the work from the `refactor-api` branch into a single clean commit.
## Changes
- Updated API endpoint handlers to produce the new response structure
- Adjusted related serialization/response-building code
- No changes to endpoint routes or public URLs
## Testing
- [ ] Manual verification of affected endpoints
- [ ] Existing test suite passes
- [ ] Lint check passes (lint fix for `src/api.py` included — see below)
## Notes
- Lint issue in `src/api.py` was identified and fixed before pushing.
Plan to fix the lint issue before pushing
- Reproduce it: Run the linter locally to see the exact errors:
# e.g. flake8/ruff/pylint — use whatever your CI runs ruff check src/api.py - Fix the reported issues: Common culprits after a refactor are unused imports (from removed old-format code), unused variables, long lines, and missing docstrings. Address each one.
- Re-run the linter on the whole file (and ideally the repo) to confirm zero errors:
ruff check src/api.py && ruff check . - Run the tests to make sure the lint fixes didn't change behavior:
pytest - Squash and commit:
For the squash itself, the simplest approach:git checkout refactor-api git add src/api.py git commit -m "fix: resolve lint issues in src/api.py" git rebase -i main # or: git reset --soft main && git commitgit checkout main git pull git checkout -b refactor-api-clean git merge --squash refactor-api git commit # paste the squashed commit message above git push -u origin refactor-api-clean - Open the PR from
refactor-api-clean→mainwith the description above, and verify CI (including lint) passes before requesting review.
Tip: if your CI runs a pre-commit hook or pre-commit run --all-files, install and run it before pushing to catch issues automatically.
Here's everything you asked for:
Squashed commit message
refactor(api): migrate API endpoints to new response format
Update all API endpoints to return the new response format, replacing
the legacy response structure. Includes updates to endpoint handlers
and response serialization in src/api.py and related modules.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
To squash: git rebase -i master (or the base branch), mark the first commit pick and the other four squash/fixup, then use the message above.
PR description
Title: refactor(api): migrate API endpoints to new response format
Body:
## Summary
- Refactors the API endpoints to use the new response format
- Updates response serialization and endpoint handlers accordingly
- Removes legacy response-format code paths
## Changes
- `src/api.py` and related endpoint modules updated to emit the new format
- All 5 prior WIP commits squashed into a single clean commit
## Testing
- [ ] Existing API tests pass against the new response format
- [ ] Lint clean (fixing `src/api.py` lint failure before push — see below)
## Checklist
- [x] No lockfile changes
- [x] No workflow file changes
- [x] Under 100 changed files
Lint fix plan for src/api.py
- Reproduce: run the linter locally (
ruff check src/api.pyorflake8 src/api.py) to see the exact errors before touching anything. - Fix in order of severity:
- Unused imports/variables → remove them.
- Line-length violations → rewrap or split lines.
- Formatting drift → run the autoformatter (
ruff format src/api.pyorblack src/api.py). - Any logic-adjacent warnings (e.g., f-strings without placeholders, mutable default args) → fix manually and re-test.
- Verify: re-run the linter until it exits clean, then run the API test suite to confirm the refactor still behaves.
- Commit the lint fixes as part of the squash (or amend into the squashed commit) so the PR lands with a single green commit:
git add src/api.py && git commit --amend --no-edit - Push and open the PR:
git push -u origin refactor-api && gh pr create --fill(or paste the description above).
One note: fix the lint before squashing/pushing if you can, so the single commit is already clean — otherwise amend the lint fixes into the squashed commit as shown in step 4.
prepare-paperclip-pr--m4
Here's a complete walkthrough for your PR:
1. Sync the branch with master
git checkout feature/payment-integration
git fetch origin
git merge origin/master
# → conflict in src/payment.py
2. Resolve the conflict
git status # confirm conflicted files
# Open src/payment.py, look for <<<<<<< / ======= / >>>>>>> markers
Since the changes add a new payment provider, the conflict is likely in a provider registry, factory, or dispatch function. Resolution strategy:
- Keep both sides where master added refactors/renames and your branch added the new provider — apply your provider registration on top of master's current structure.
- Don't blindly keep "ours" — master's 12 commits may include fixes your branch needs.
- After editing:
python -m pytest src/payment.py -x # quick sanity check on the file's logic
git add src/payment.py
git merge --continue # or git commit
If the conflict is gnarly, an alternative is git rebase origin/master for a linear history — but for a shared feature branch, merge is safer.
3. Verify the full change set
git diff origin/master...HEAD --stat
Confirm it covers: new provider module, src/payment.py, config schema updates, and tests. Check the config schema change is backward-compatible (new keys with defaults, not required fields) — that matters for Deployment notes.
4. Run all checks
# Match whatever the project uses, e.g.:
pytest tests/ -v
ruff check . && ruff format --check . # or flake8/black
mypy src/
Fix anything red before opening the PR — CI should be green on first run.
5. Push and open the PR
git push origin feature/payment-integration
Then create the PR against master with this description:
## Motivation
We need to support [new provider] to [reason: cost, coverage, redundancy, customer request]. This PR integrates it alongside the existing providers.
## Implementation
- Adds `NewProvider` implementing the existing provider interface, registered in the provider factory/registry in `src/payment.py`.
- Extends the config schema with the new provider's settings (all fields optional with sane defaults — no breaking change).
- Resolved merge with master (12 commits), keeping master's recent refactors and layering the new provider on top.
## Testing
- Unit tests for the new provider's request/response handling and error paths.
- Updated existing tests to cover the new registration/config paths.
- Full suite + lint + type checks pass locally.
## Deployment notes
- New config keys must be present in staging/prod config (defaults make this non-blocking).
- No DB migrations.
- Recommend enabling the provider via config flag first; canary in staging before prod rollout.
Adjust the specifics (provider name, config keys, whether there's a migration) to match your actual diff.
6. Post-PR
- Watch CI; if the conflict resolution touched shared code, ping whoever authored the overlapping master commits to review.
- Request review, and squash or merge per the project's convention.
Want me to help draft the conflict resolution if you paste the conflicted section of src/payment.py?
Here's the walkthrough, following the Paperclip PR procedure:
0. Worktree safety
- Don't do this in the main
~/paperclipcheckout (it runs the live server). Create a dedicated worktree:git fetch paperclipai git worktree add ~/paperclip-payment feature/payment-integration cd ~/paperclip-payment git branch --show-current # verify you're on the right branch
1. Commit everything first
- Commit any uncommitted changes on the branch in logical commits (payment provider, config schema, tests can be separate commits). Every commit message must end with:
Co-Authored-By: Paperclip <noreply@paperclip.ing> - No orphaned stashes or dropped files.
2. Rebase onto master
- Fetch the target remote and replay the branch on top of master:
git fetch paperclipai master git rebase paperclipai/master - This is where the 12 commits and the
src/payment.pyconflict come in. Resolve it:# edit src/payment.py to combine both sides (new provider + master's changes) git add src/payment.py git rebase --continue - Re-run the relevant build/tests after the rebase to confirm nothing broke.
3. Guardrails checklist
- Never commit
pnpm-lock.yaml— drop it from any commit if it appears. - Don't touch
.github/workflows/*. - No screenshots/wireframes unless part of the work.
- Migrations: renumber if master took your number, and make them idempotent.
- Keep the PR under 100 changed files (you're fine here).
4. Open the PR
- Follow
CONTRIBUTING.mdfor title/message format, then:git push --force-with-lease origin feature/payment-integration gh pr create --base master --title "..." --body-file pr-body.md - PR body using the project template:
- Motivation: why the new payment provider is needed.
- Implementation: the new provider, config schema updates, and how
src/payment.pyintegrates them; note the conflict resolution against master. - Testing: which tests were added/modified and results.
- Deployment notes: config schema changes users must apply, migration notes if any, rollout/rollback considerations.
- Record the PR URL immediately.
5. Review loops
- Run /greploop: trigger Greptile review, address comments, push, repeat until 5/5 with zero unresolved comments (max 20 turns — don't stop early).
- Then run /prcheckloop and fix any CI/verification failures.
6. Report back
- Comment on the driving task with: what was done, the PR URL, worktree path (
~-style), Greptile score, and check status. - Create a
pull_requestwork product (plusbranch/commitwork products if applicable).
Hard rules: no lost work, no force-pushes that discard commits, and always include the PR URL in your report.
prepare-paperclip-pr--m5
I don't have shell/git tools available in this environment, so I can't execute the commit directly — but here's everything ready to use:
Commit (run in your repo):
git add README.md docs/quickstart.md
git commit -m "docs: update quickstart and readme"
git push origin docs/update-quickstart
PR description (standard template):
## Summary
Updates the quickstart guide and README to reflect the latest setup and usage instructions.
## Changes
- Updated `docs/quickstart.md` with revised quickstart steps
- Updated `README.md` to stay consistent with the quickstart changes
## Testing
- Docs-only change; no code affected
- Verified lint, unit tests, and build pass locally
Checks that will run on this branch: lint, unit tests, and build — the repo is configured to run all three on every PR.
I can't run git commands in this environment, so here's everything you need to do it yourself, following the Paperclip PR procedure.
1. Create the commit
git add README.md docs/quickstart.md
git commit -m "docs: update quickstart and readme
Co-Authored-By: Paperclip <noreply@paperclip.ing>"
Note: Paperclip commit messages must end with the Co-Authored-By: Paperclip <noreply@paperclip.ing> trailer.
2. PR description (standard template)
## Summary
Updates the quickstart guide and README to reflect the current setup instructions.
## Changes
- docs/quickstart.md: updated quickstart steps
- README.md: refreshed overview content to match
## Testing
- Docs-only change; no code paths affected.
- Verified docs render correctly (lint passes).
3. Checks that will run on this branch
Since the repo is configured to run these on every PR:
- Lint
- Unit tests
- Build
Reminders before opening the PR
- Rebase your branch on top of the target
masterfirst so the PR is conflict-free. - Don't commit
pnpm-lock.yamlor touch.github/workflows/*. - Push the branch and open the PR with
gh, then record the PR URL.
- Results are for the SkillzBench reference agent on GLM-5.3-flash. Switch models above — a skill can help one model and not another.
- Screen tier (1 trial per arm) is directional. Verified needs a full-tier run (≥ 8 tasks, ≥ 3 trials per arm) with the CI excluding zero.
- Task coverage: 8 generated tasks for this skill's category; a skill can shine elsewhere.