Entwickler-Produktivität

Surgical Patch

Julius BrusseeApache-2.0Sprache des Skills: Englisch
Lizenz geprüftKeine Skripte
DemoEchter Lauf · claude-opus-5-5 · Oktober 2026
Bug: `paginate([1,2,3,4,5], page=2, size=2)` returns `[4, 5]` but should return `[3, 4]`. Page numbers are 1-based. The files are not in this workspace, so give me the fix as a diff and I will apply it. ```python # utils/pagination.py def paginate(items, page, size): """Return the items on a 1-based page.""" if size <= 0: raise ValueError("size must be positive") start = page * size end = start + size return items[start:end] def page_count(items, size): return (len(items) + size - 1) // size ``` ```python # tests/test_pagination.py from utils.pagination import paginate, page_count def test_page_count(): assert page_count([1, 2, 3, 4, 5], 2) == 3 ```
Skill: surgical-patch

The bug is in how the start index is calculated. start = page * size treats page as 0-based, so page 2 starts at index 4 and returns [4, 5]. For a 1-based page, the start index needs to be (page - 1) * size.

--- a/utils/pagination.py
+++ b/utils/pagination.py
@@ -2,7 +2,7 @@ def paginate(items, page, size):
     """Return the items on a 1-based page."""
     if size <= 0:
         raise ValueError("size must be positive")
-    start = page * size
+    start = (page - 1) * size
     end = start + size
     return items[start:end]
 
--- a/tests/test_pagination.py
+++ b/tests/test_pagination.py
@@ -3,2 +3,10 @@ from utils.pagination import paginate, page_count
 def test_page_count():
     assert page_count([1, 2, 3, 4, 5], 2) == 3
+
+
+def test_paginate_is_one_based():
+    items = [1, 2, 3, 4, 5]
+    assert paginate(items, page=1, size=2) == [1, 2]
+    assert paginate(items, page=2, size=2) == [3, 4]
+    assert paginate(items, page=3, size=2) == [5]
+    assert paginate(items, page=4, size=2) == []

The new test checks the case you reported (page 2), plus the first page, the partial last page, and a page past the end. I couldn't run it because the files aren't in this workspace. After you apply the diff, run pytest tests/test_pagination.py. The new test should fail on the old code and pass with the fix.

Something to consider: this diff only fixes the off-by-one. It still doesn't check that page is valid. Now that pages start at 1, page=0 gives start = -size, so it would return a slice taken from the end of the list instead of failing. If you want that rejected, add if page < 1: raise ValueError("page must be >= 1") next to the existing size check. I didn't include it because it changes behavior beyond the bug you reported.

Real run recorded with claude-code / claude-opus-5-5. Output is shown verbatim, unmodified.

Was es macht

Eine Arbeitsregel für Bugfixes und kleine Verhaltensänderungen: nur die zuständige Schicht ändern und den Fix belegen.

So funktioniert es

  1. Reproduziert den Fehler zuerst, wenn das günstig ist; sonst sammelt es die stärksten verfügbaren Belege.
  2. Verfolgt das Symptom bis zum verantwortlichen Mechanismus und ändert nur diese Schicht.
  3. Verzichtet außerhalb des Fixes auf Aufräumen, Umbenennen und neue Abstraktionen und lässt fremdes Verhalten und deine eigenen Änderungen in Ruhe.
  4. Ergänzt nur den nötigen Regressionsnachweis, führt ihn und die nächstliegenden Prüfungen aus und hört auf, sobald sie bestehen.

Geeignet für

Bugfixes in gewachsenen Codebasen, wenn Reviewer kleine, fokussierte Diffs wollen.

Gut zu wissen

Eines der allgemeinen Arbeitsmuster aus dem Open-Source-Projekt Caveman. Die Anweisungen selbst tragen kein Caveman-Branding und funktionieren in jedem Projekt.

Hinweise & Risiken

Reine Anweisungsdatei: keine Skripte, kein Netzwerkzugriff, keine Dateischreibvorgänge. Das Paket enthält außerdem LICENSE, NOTICE und agents/openai.yaml (Anzeigename und Standard-Prompt für Codex).