Auto-syncs stale docstrings and README when function signatures change. Detects documentation drift after refactors, parameter additions, or return type changes. Dry-run by default — proposes before writing.
87
100%
Does it follow best practices?
Impact
86%
1.59xAverage score across 17 eval scenarios
Passed
No known issues
After every documentation edit, perform this 3-point mechanical verification. These checks are non-negotiable before reporting success.
Question: Does the symbol I just documented actually exist in the codebase?
How to verify:
# For functions
grep -r "def function_name" --include="*.py"
grep -r "function function_name" --include="*.js"
grep -r "func FunctionName" --include="*.go"
# For classes
grep -r "class ClassName" --include="*.py"
grep -r "class ClassName" --include="*.ts"Failure mode: Documenting a symbol that was renamed or removed.
If check fails:
[NEEDS HUMAN REVIEW]: "Symbol X not found in codebase"Question: Do the parameters in my documentation exactly match the actual function signature?
How to verify:
Example verification:
Actual code:
def process(data: dict, *, validate: bool = True, timeout: int = 30) -> Result:Documentation must show:
data (dict) — required positionalvalidate (bool, default: True) — keyword-onlytimeout (int, default: 30) — keyword-onlyResultFailure modes:
valdate instead of validate)If check fails:
Question: Is the documentation syntactically valid for its format?
Markdown table syntax:
| Header | Header |
|--------|--------| ← Must have separator row
| Cell | Cell | ← Pipes must align (approximately)Docstring syntax (Python):
def func():
"""Short description.
Args:
param: Description. ← Proper indentation
Returns:
Description. ← Proper section
"""JSDoc syntax:
/**
* Short description.
* @param {string} name - Description. ← Proper format
* @returns {number} Description. ← Proper format
*/Common syntax errors:
If check fails:
Use this template after each edit:
## Verification: [symbol_name]
### 1. Symbol Exists
- [ ] Searched codebase for symbol
- [ ] Symbol found at: [file:line]
### 2. Parameters Match
- [ ] Compared each parameter name
- [ ] Compared each parameter type
- [ ] Compared default values
- [ ] Count matches: [N] params in code, [N] params in docs
### 3. Syntax Valid
- [ ] Docstring/JSDoc properly formatted
- [ ] Markdown tables have separator rows
- [ ] Code blocks properly closed
- [ ] No unclosed formatting
Result: [PASS / FAIL - reason]When updating multiple symbols, verify each one individually. Do not batch-verify — each symbol needs independent confirmation.
Correct:
Verified: parse() ✓
Verified: validate() ✓
Verified: transform() ✓Incorrect:
Verified: all 3 functions ✓ ← Too vague, may hide errors| Failure | Action |
|---|---|
| Symbol not found | Revert change, flag for review |
| Params don't match | Correct documentation |
| Syntax invalid | Fix syntax |
| Multiple failures | Revert all, report issues |
If you cannot mechanically verify a change, you should not have made it.
Every documentation update must be verifiable by:
If your change cannot be verified by these mechanical means, it likely involves judgment — flag it for human review instead.
evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10
scenario-11
scenario-12
scenario-13
scenario-14
scenario-15
scenario-16
scenario-17