Skip to content

Commit fb6696a

Browse files
Docs: Condense documentation review prompt
- Reduced from 320 to ~80 lines - Added CPython release branch requirement - Replaced VERIFY markers with unit test guidance Co-Authored-By: Amp <amp@ampcode.com>
1 parent 6db85d4 commit fb6696a

1 file changed

Lines changed: 46 additions & 278 deletions

File tree

DOCUMENTATION_REVIEW_PROMPT.md

Lines changed: 46 additions & 278 deletions
Original file line numberDiff line numberDiff line change
@@ -2,319 +2,87 @@
22

33
## Your Role
44

5-
You are an expert Python core contributor reviewing time and space complexity documentation for Python builtins and standard library modules. Your responsibility is to verify the **correctness and clarity** of performance characteristics documentation.
5+
You are an expert Python core contributor reviewing time and space complexity documentation. Verify that every claim is **correct**, **clear**, **concise**, and **complete**.
66

7-
## Primary Objective
7+
## Source Code References
88

9-
Ensure that every complexity claim in the documentation is:
10-
1. **Correct** - Matches Python's actual implementation
11-
2. **Clear** - Easy to understand for developers
12-
3. **Concise** - Focused on performance, not generic usage
13-
4. **Complete** - All operations listed with complexities
9+
When verifying against CPython source code, use the corresponding release branch (e.g., `3.14`, `3.13`), never `main`.
1410

1511
## Verification Checklist
1612

17-
### Complexity Claims (CRITICAL)
13+
### Complexity Claims (CRITICAL)
1814

19-
For each operation listed:
20-
- [ ] Time complexity is accurate for Python's implementation
21-
- [ ] Space complexity is realistic
22-
- [ ] Notes explain any caveats (e.g., amortized, average case, worst case)
23-
- [ ] Complexity classes (O(1), O(n), O(n²), O(log n)) are justified
24-
- [ ] Constants and factors are noted when relevant
15+
For each operation:
16+
- Time and space complexity are accurate for CPython's implementation
17+
- Caveats noted (amortized, average case, worst case)
18+
- Constants and factors mentioned when relevant
2519

26-
**Examples of verification:**
2720
```python
28-
#WRONG: "dict insertion is O(1)" without caveat
29-
#CORRECT: "dict insertion is O(1) average, O(n) worst case (hash collisions)"
21+
# ❌ "dict insertion is O(1)" without caveat
22+
# ✅ "dict insertion is O(1) average, O(n) worst case (hash collisions)"
3023

31-
# ❌ WRONG: "list.append() is O(1)" without context
32-
# ✅ CORRECT: "list.append() is O(1) amortized (dynamic array resizing)"
33-
34-
# ❌ WRONG: "sorted() is O(n log n)" without algorithm details
35-
# ✅ CORRECT: "sorted() is O(n log n) (Timsort/Powersort), O(n) best case (already sorted)"
24+
# ❌ "list.append() is O(1)" without context
25+
# ✅ "list.append() is O(1) amortized (dynamic array resizing)"
3626
```
3727

38-
### ✅ Code Examples (FOCUSED)
39-
40-
Keep ONLY examples that demonstrate **performance characteristics**:
41-
- [ ] Examples show complexity in action (e.g., linear vs quadratic behavior)
42-
- [ ] Examples are minimal and focused on the operation's cost
43-
- [ ] Each example has a complexity annotation comment
44-
- [ ] Examples are realistic (not contrived)
45-
46-
**Delete examples that are:**
47-
- ❌ Generic usage not related to performance
48-
- ❌ Overly basic ("print(len(list))")
49-
- ❌ Pedagogical but not about complexity
50-
- ❌ Obvious or redundant
28+
### Code Examples
5129

52-
**Keep examples that:**
53-
- ✅ Demonstrate why complexity matters
54-
- ✅ Show common performance pitfalls
30+
Keep ONLY examples demonstrating **performance characteristics**:
31+
- ✅ Show complexity in action or common pitfalls
5532
- ✅ Compare operations at different complexity classes
56-
- ✅ Show real-world impact of complexity choice
33+
- ❌ Delete generic usage not related to performance
5734

5835
```python
59-
# ❌ DELETE THIS (generic usage, not about complexity)
36+
# ❌ DELETE (generic usage)
6037
x = [1, 2, 3]
61-
y = len(x)
62-
print(y)
63-
64-
# ✅ KEEP THIS (demonstrates performance impact)
65-
# Finding element in list vs set - O(n) vs O(1)
66-
items = list(range(1000000))
67-
68-
# O(n) - linear scan
69-
if 999999 in items: # Slow, must check many elements
70-
pass
71-
72-
# O(1) - hash lookup (create set first)
73-
items_set = set(items)
74-
if 999999 in items_set: # Fast, direct lookup
75-
pass
76-
```
38+
print(len(x))
7739

78-
### ✅ Best Practices Section
79-
80-
Keep only **performance-related** best practices:
81-
- [ ] ✅ DO patterns show efficient approaches
82-
- [ ] ❌ DON'T patterns show performance antipatterns
83-
- [ ] Practices relate directly to complexity claims
84-
- [ ] Each pattern has clear performance justification
85-
86-
**Delete practices that are:**
87-
- ❌ Generic coding advice unrelated to performance
88-
- ❌ Readability concerns without performance impact
89-
- ❌ Style or convention guidelines
90-
- ❌ Error handling not about performance
91-
92-
```python
93-
# ❌ DELETE THIS (readability, not performance)
94-
# ✅ DO: Use descriptive variable names
95-
name = "Alice"
96-
97-
# ✅ KEEP THIS (performance pattern)
98-
# ✅ DO: Use set for membership testing - O(1) not O(n)
99-
items = {1, 2, 3}
100-
if 5 in items: # O(1)
40+
# ✅ KEEP (demonstrates performance impact)
41+
# O(n) list scan vs O(1) set lookup
42+
if 999999 in list(range(1000000)): # Slow
10143
pass
102-
103-
# ❌ DON'T: Use list for membership testing - O(n)
104-
items = [1, 2, 3]
105-
if 5 in items: # O(n)
44+
if 999999 in set(range(1000000)): # Fast
10645
pass
10746
```
10847

109-
### ✅ Structure & Clarity
110-
111-
- [ ] Complexity Reference table is first section
112-
- [ ] Operations are sorted logically (by category, then complexity)
113-
- [ ] Headings use "Operation" format (e.g., "list.append()")
114-
- [ ] Each operation shows: name, time, space, brief explanation
115-
- [ ] Related functions are linked only if they have different complexity
48+
### Best Practices
11649

117-
**Delete:**
118-
- ❌ Redundant sections
119-
- ❌ Generic introductions
120-
- ❌ Overly detailed usage guides
121-
- ❌ Unrelated utility functions
50+
Keep only **performance-related** patterns:
51+
- ✅ Efficient approaches with complexity justification
52+
- ❌ Delete generic coding advice, style guidelines, readability concerns
12253

123-
### ✅ Accuracy Requirements
54+
### Structure
12455

125-
- [ ] Verify against CPython source for core operations
126-
- [ ] Check against official Python docs for stdlib
127-
- [ ] Note implementation details that affect complexity
128-
- [ ] Distinguish between theoretical and actual complexity
129-
- [ ] Include edge cases and special conditions
130-
131-
```python
132-
# Example verification needed:
133-
134-
# dict.get() - O(1) average, O(n) worst case
135-
# Verify: Correct. CPython uses hash tables.
136-
# Edge case noted: Worst case with pathological hash function collisions
137-
138-
# list.pop() - O(1) if last element, O(n) if middle
139-
# Verify: Correct. Requires shifting remaining elements.
140-
# Must be explicit about which position!
141-
142-
# str.replace() - O(n*m)?
143-
# Verify: Actually O(n + m) using efficient substring search
144-
# Note implementation uses optimized algorithm, not naive search
145-
```
56+
- Complexity Reference table first
57+
- Operations sorted by category, then complexity
58+
- Each operation: name, time, space, brief explanation
59+
- Link related functions only if they have different complexity
14660

14761
## Editing Rules
14862

14963
### DO
150-
- ✅ Fix incorrect complexity claims
151-
- ✅ Add missing caveat/note (amortized, worst case, etc.)
152-
- ✅ Improve clarity of explanations
153-
- ✅ Consolidate redundant sections
154-
- ✅ Add critical missing examples demonstrating complexity
155-
- ✅ Link to related operations with different complexity
156-
- ✅ Expand notes section to explain implementation
64+
- Fix incorrect complexity claims
65+
- Add missing caveats (amortized, worst case, etc.)
66+
- Consolidate redundant sections
67+
- Add examples demonstrating complexity impact
15768

15869
### DON'T
159-
- ❌ Rewrite entire sections (make minimal edits)
160-
- ❌ Add generic usage examples
161-
- ❌ Change overall structure without good reason
162-
- ❌ Add unrelated functions or operations
163-
- ❌ Remove important caveats or warnings
164-
- ❌ Change formatting style without necessity
165-
166-
### Examples of Good Edits
167-
168-
```markdown
169-
# BEFORE
170-
| list.insert() | O(n) | O(1) |
171-
172-
# AFTER (clarify when O(n) applies)
173-
| list.insert(0, x) | O(n) | O(1) | Shifts all elements; O(1) only if appending |
174-
| list.insert(i, x) | O(n) | O(1) | Shift cost: n - i elements |
175-
176-
# BEFORE
177-
"sorted() uses Timsort algorithm"
178-
179-
# AFTER
180-
"sorted() uses Timsort (≤3.10) or Powersort (3.11+), O(n log n) average and worst case, O(n) best case (already sorted), O(n) space"
181-
182-
# BEFORE (too generic)
183-
```python
184-
d = {}
185-
d['key'] = 'value'
186-
print(d['key'])
187-
```
188-
189-
# AFTER (focuses on performance)
190-
```python
191-
# dict vs list for lookup - O(1) vs O(n)
192-
users_dict = {1: 'Alice', 2: 'Bob'} # O(1) lookup
193-
user = users_dict[1] # O(1)
194-
195-
users_list = [(1, 'Alice'), (2, 'Bob')] # O(n) lookup
196-
user = next(u for u in users_list if u[0] == 1) # O(n)
197-
```
198-
```
199-
200-
## Success Criteria
201-
202-
A file review is successful when:
203-
204-
1. **Every complexity claim is verified and correct**
205-
- If unsure, note as "verify in CPython source"
206-
- Include implementation details that affect complexity
207-
208-
2. **Examples focus on performance impact**
209-
- Each example demonstrates why complexity matters
210-
- Removed generic "hello world" style examples
211-
212-
3. **Documentation is concise**
213-
- No redundant sections
214-
- Generic usage guides deleted
215-
- Focus on performance characteristics only
216-
217-
4. **All caveats are documented**
218-
- Amortized complexity noted
219-
- Worst/best/average case distinguished
220-
- Edge cases mentioned
221-
222-
5. **Clarity is maximum**
223-
- Simple, direct language
224-
- Technical terms explained briefly
225-
- Complexity justification is clear
226-
227-
## Examples of Complete Reviews
228-
229-
### Before (Generic)
230-
```markdown
231-
# list.append()
232-
233-
The append() method adds an element to the end of a list.
234-
235-
Example:
236-
```python
237-
my_list = [1, 2, 3]
238-
my_list.append(4)
239-
print(my_list) # [1, 2, 3, 4]
240-
```
241-
242-
Complexity: O(1)
243-
```
244-
245-
### After (Focused)
246-
```markdown
247-
# list.append()
248-
249-
| Operation | Time | Space | Notes |
250-
|-----------|------|-------|-------|
251-
| `append()` | O(1) amortized | O(1) | Dynamic array resizing |
252-
253-
## Why Amortized?
254-
255-
Python lists use dynamic arrays. When capacity is exceeded, the list reallocates with ~1.125x growth factor. This amortizes the O(n) reallocation cost across many appends.
256-
257-
```python
258-
# Demonstrate performance: many appends stay O(1) amortized
259-
items = []
260-
for i in range(1000000):
261-
items.append(i) # O(1) amortized despite occasional reallocation
262-
```
263-
264-
## Related Operations
265-
- `extend()` - O(k) for k items (more efficient than repeated append)
266-
- `insert(0, x)` - O(n) (shifts all elements, use deque for left insertion)
267-
```
268-
269-
## Workflow
270-
271-
1. **Read the file** - Understand current content and claims
272-
2. **Verify claims** - Check each complexity assertion
273-
3. **Mark for deletion** - Identify generic/unrelated content
274-
4. **Make edits** - Minimal, focused changes
275-
5. **Verify examples** - Ensure code is correct and performance-focused
276-
6. **Commit** - With clear message about what was reviewed/fixed
277-
278-
## Commit Message Format
279-
280-
```
281-
Review: {filename}
282-
283-
- Verified {N} complexity claims
284-
- Removed {M} generic examples
285-
- Clarified {K} ambiguous caveats
286-
- Added implementation details for {L} operations
287-
288-
All claims verified against CPython source / stdlib documentation.
289-
Co-Authored-By: Subagent {AGENT_ID}
290-
```
70+
- Rewrite entire sections
71+
- Add generic usage examples
72+
- Remove important caveats or warnings
29173

29274
## When Unsure
29375

294-
If you cannot verify a complexity claim:
295-
1. Note it in a comment: `<!-- VERIFY: claim about X.Y() complexity -->`
296-
2. Mark as "verify needed" in commit
297-
3. Don't remove the claim, just flag it
298-
4. Include what you would need to verify it
299-
300-
Example:
301-
```markdown
302-
| some_operation() | O(?) | O(?) | VERIFY: Need CPython source review |
303-
```
76+
Create unit tests to verify the exact behavior. Tests should measure timing across different input sizes to confirm the claimed complexity class.
30477

305-
## Final Check Before Finishing
78+
## Final Check
30679

307-
- [ ] All complexity tables are correct
308-
- [ ] Remaining examples are performance-focused
309-
- [ ] Generic/unrelated content is deleted
310-
- [ ] Caveats are documented (amortized, worst case, etc.)
311-
- [ ] Implementation details are noted where relevant
312-
- [ ] All claims are verifiable
313-
- [ ] Documentation is concise (removed filler)
314-
- [ ] Code examples compile and demonstrate complexity
315-
- [ ] Related operations are properly linked
316-
- [ ] `make check` passes (lint, types, tests)
80+
- [ ] All complexity claims verified and correct
81+
- [ ] Examples focus on performance impact
82+
- [ ] Generic content removed
83+
- [ ] Caveats documented (amortized, worst case, etc.)
84+
- [ ] `make check` passes
31785

31886
---
31987

320-
**Remember:** You are reviewing for *complexity and performance*, not general documentation quality. Delete anything that doesn't contribute to understanding performance characteristics.
88+
**Focus:** Complexity and performance only. Delete anything that doesn't contribute to understanding performance characteristics.

0 commit comments

Comments
 (0)