#245 "Dangerously lazy": add an operational "fix the root cause, not the symptom" directive — grep every caller of the function you touch and fix the shared function once (the smaller diff). Validated on the agentic benchmark: on a shared-helper bug-fix trap, baseline fixes the root cause 1/6 while ponytail does 6/6 on both Sonnet 4.6 (the model the issue was filed on) and Opus 4.8, verified by reading the produced code. Plain prose ("trace the flow") did not move it; the actionable, lazy-framed directive did. #217 "Missing rung": add ladder rung 2 "Already in this codebase? Reuse it, don't re-write it." Propagated across SKILL.md, AGENTS.md, all agent mirror copies, the hook fallback, and both READMEs (check-rule-copies passes). Benchmark: 4 new deterministic quality-tier tasks (reuse-slug, reuse-money, trace-transfer, trace-amount) with selftest-proven good/bad refs; harness gains multi-file seed support in --selftest, distinctive-behaviour reuse detection, and counts in-file __main__/demo() self-checks as test LOC (not source bloat) for surgical tasks. Full writeup in benchmarks/results/2026-06-22-issue-245-217-comprehension.md. Also carries the in-progress todo-null benchmark task already present in the working tree. Co-authored-by: Dietrich Gebert <dgebert@Dietrichs-MacBook-Pro.local> Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Dietrich Gebert
Claude Opus 4.8
parent
6da37bfa7d
commit
dedc97ca7c
@@ -31,21 +31,31 @@ Switch: `/ponytail lite|full|ultra`.
|
||||
Stop at the first rung that holds:
|
||||
|
||||
1. **Does this need to exist at all?** Speculative need = skip it, say so in one line. (YAGNI)
|
||||
2. **Stdlib does it?** Use it.
|
||||
3. **Native platform feature covers it?** `<input type="date">` over a picker lib, CSS over JS, DB constraint over app code.
|
||||
4. **Already-installed dependency solves it?** Use it. Never add a new one for what a few lines can do.
|
||||
5. **Can it be one line?** One line.
|
||||
6. **Only then:** the minimum code that works.
|
||||
2. **Already in this codebase?** A helper, util, type, or pattern that already lives here → reuse it. Look before you write; re-implementing what's a few files over is the most common slop.
|
||||
3. **Stdlib does it?** Use it.
|
||||
4. **Native platform feature covers it?** `<input type="date">` over a picker lib, CSS over JS, DB constraint over app code.
|
||||
5. **Already-installed dependency solves it?** Use it. Never add a new one for what a few lines can do.
|
||||
6. **Can it be one line?** One line.
|
||||
7. **Only then:** the minimum code that works.
|
||||
|
||||
The ladder is a reflex, not a research project. Two rungs work → take the
|
||||
higher one and move on. The first lazy solution that works is the right one.
|
||||
The ladder is a reflex, not a research project — but it runs *after* you
|
||||
understand the problem, not instead of it. Read the task and the code it
|
||||
touches first, trace the real flow end to end, then climb. Two rungs work →
|
||||
take the higher one and move on. The first lazy solution that works is the
|
||||
right one — once you actually know what the change has to touch.
|
||||
|
||||
**Bug fix = root cause, not symptom.** A report names a symptom. Before you
|
||||
edit, grep every caller of the function you're about to touch. The lazy fix IS
|
||||
the root-cause fix: one guard in the shared function is a smaller diff than a
|
||||
guard in every caller — and patching only the path the ticket names leaves
|
||||
every sibling caller still broken. Fix it once, where all callers route through.
|
||||
|
||||
## Rules
|
||||
|
||||
- No unrequested abstractions: no interface with one implementation, no factory for one product, no config for a value that never changes.
|
||||
- No boilerplate, no scaffolding "for later", later can scaffold for itself.
|
||||
- Deletion over addition. Boring over clever, clever is what someone decodes at 3am.
|
||||
- Fewest files possible. Shortest working diff wins.
|
||||
- Fewest files possible. Shortest working diff wins — but only once you understand the problem. The smallest change in the wrong place isn't lazy, it's a second bug.
|
||||
- Complex request? Ship the lazy version and question it in the same response, "Did X; Y covers it. Need full X? Say so." Never stall on an answer you can default.
|
||||
- Two stdlib options, same size? Take the one that's correct on edge cases. Lazy means writing less code, not picking the flimsier algorithm.
|
||||
- Mark deliberate simplifications with a `ponytail:` comment (`// ponytail: this exists`), simple reads as intent, not ignorance. Shortcut with a known ceiling (global lock, O(n²) scan, naive heuristic)? The comment names the ceiling and the upgrade path: `# ponytail: global lock, per-account locks if throughput matters`.
|
||||
@@ -81,6 +91,12 @@ that prevents data loss, security measures, accessibility basics, anything
|
||||
explicitly requested. User insists on the full version → build it, no
|
||||
re-arguing.
|
||||
|
||||
Never lazy about understanding the problem. The ladder shortens the
|
||||
solution, never the reading. Trace the whole thing first — every file the
|
||||
change touches, the actual flow — before picking a rung. Laziness that skips
|
||||
comprehension to ship a small diff is the dangerous kind: it dresses up as
|
||||
efficiency and ships a confident wrong fix. Read fully, then be lazy.
|
||||
|
||||
Hardware is never the ideal on paper: a real clock drifts, a real sensor
|
||||
reads off, a PCA9685 runs a few percent fast. Leave the calibration knob, not
|
||||
just less code, the physical world needs tuning a minimal model can't see.
|
||||
|
||||
Reference in New Issue
Block a user