Sign inGet started
–

Prepares a Paperclip branch for a pull request with proper commits, checks, and formatting.

Lift · GLM-5.3-flash+13ppdirectional · all models →
87
Trustsecurity · quality · license · upkeep
Scan Saferisk 0/100
LicenseMITserved via MCP
Claude Haiku 5.5 · GPT-6 Luna — not run yet
Pass-rate Lift+13pp95% CI [0, +38] · CI includes zero
screen tier · directionalchat harness (v2)
−100pp+100pp

Pass rate with the skill minus without, same tasks, same model.

baseline
88%
with skill
100%
forced
75%
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
SkillzBench badge preview

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 →

Markdown[![SkillzBench](https://skillzbench.com/api/badge/prepare-paperclip-pr.svg)](https://skillzbench.com/skills/prepare-paperclip-pr)
+ cost/task[![SkillzBench](https://skillzbench.com/api/badge/prepare-paperclip-pr.svg?cost=1)](https://skillzbench.com/skills/prepare-paperclip-pr)
HTML<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
baseline · 0.62

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 only src/auth.py and tests/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.py change)
  • Tests cover edge cases: empty string "", whitespace-only " ", and None if 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?

with skill · 0.85

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

  1. Worktree safety — confirm you're on a dedicated worktree/branch (git branch --show-current), not the main ~/paperclip checkout.
  2. Commit everything — both files committed with logical messages ending in Co-Authored-By: Paperclip <noreply@paperclip.ing>.
  3. Rebase on master — fetch the target remote and rebase fix-login so there are no conflicts; re-run the auth tests after.
  4. Run the tests — pytest tests/test_auth.py (plus the broader suite if quick) and confirm they pass.
  5. Guardrails — no pnpm-lock.yaml committed, no .github/workflows/* changes, no stray images, under 100 changed files (you're fine at 2).
  6. Open the PR — push the branch and open against master on paperclipai/paperclip with gh, following CONTRIBUTING.md.
  7. Review loops — run the Greptile review loop until 5/5 with zero unresolved comments, then the /prcheckloop for CI/verification failures.

If you'd like, I can help draft the exact commit messages or refine the description further.

prepare-paperclip-pr--m2
baseline · 1.00

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"

with skill · 1.00

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)

  1. Do this in a git worktree, not the main ~/paperclip checkout.
  2. Rebase onto the target remote's master and re-run the relevant tests.
  3. Follow CONTRIBUTING.md for exact title/message format, push, and open with gh.
  4. 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
baseline · 1.00

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

  1. 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
    
  2. 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.
  3. Re-run the linter on the whole file (and ideally the repo) to confirm zero errors:
    ruff check src/api.py && ruff check .
    
  4. Run the tests to make sure the lint fixes didn't change behavior:
    pytest
    
  5. Squash and commit:
    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 commit
    
    For the squash itself, the simplest approach:
    git 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
    
  6. Open the PR from refactor-api-clean → main with 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.

with skill · 0.88

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

  1. Reproduce: run the linter locally (ruff check src/api.py or flake8 src/api.py) to see the exact errors before touching anything.
  2. 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.py or black src/api.py).
    • Any logic-adjacent warnings (e.g., f-strings without placeholders, mutable default args) → fix manually and re-test.
  3. Verify: re-run the linter until it exits clean, then run the API test suite to confirm the refactor still behaves.
  4. 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
    
  5. 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
baseline · 0.91

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?

with skill · 0.82

Here's the walkthrough, following the Paperclip PR procedure:

0. Worktree safety

  • Don't do this in the main ~/paperclip checkout (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.py conflict 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.md for 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.py integrates 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_request work product (plus branch/commit work 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
baseline · 0.85

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.

with skill · 0.82

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 master first so the PR is conflict-free.
  • Don't commit pnpm-lock.yaml or touch .github/workflows/*.
  • Push the branch and open the PR with gh, then record the PR URL.
Limitations
  • 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.