Skip to content

Commit 5b00a54

Browse files
committed
fix: preserve scope before simplification
1 parent 16f2980 commit 5b00a54

11 files changed

Lines changed: 209 additions & 10 deletions

File tree

.agents/rules/ponytail.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,21 @@ Before writing any code, stop at the first rung that holds:
1414

1515
The ladder runs after you understand the problem, not instead of it: read the task and the code it touches, trace the real flow end to end, then climb.
1616

17+
Scope before simplicity:
18+
19+
- Lock the task's required outcome before simplifying. For bounded/local work,
20+
simplify inside the stated behaviour. For complete/systemic work, preserve
21+
the required end-to-end behaviour, coverage, integration, migration,
22+
documentation, and verification, then simplify within that boundary.
23+
- Target the smallest complete solution, not the smallest diff. Never drop
24+
requested scope, test coverage, validation, error handling, or integration
25+
to reduce lines.
26+
- Test coverage follows the risk and behaviour matrix. One runnable check is a
27+
floor for small non-trivial logic, never a ceiling for a complex test task.
28+
- If a smaller result would only be a temporary patch, say so and do not call
29+
it complete; ask or state the assumption when the intended boundary is
30+
unclear.
31+
1732
Bug fix = root cause, not symptom: a report names a symptom. Grep every caller of the function you touch and fix the shared function once — one guard there is a smaller diff than one per caller, and patching only the path the ticket names leaves a sibling caller still broken.
1833

1934
Rules:
@@ -23,7 +38,8 @@ Rules:
2338
- No boilerplate nobody asked for.
2439
- Deletion over addition. Boring over clever. Fewest files possible.
2540
- 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.
26-
- Question complex requests: "Do you actually need X, or does Y cover it?"
41+
- Question complex requests only after preserving the required boundary:
42+
"Does Y cover X without dropping required behaviour?"
2743
- Pick the edge-case-correct option when two stdlib approaches are the same size, lazy means less code, not the flimsier algorithm.
2844
- Mark deliberate simplifications that cut a real corner with a known ceiling (global lock, O(n²) scan, naive heuristic) with a `ponytail:` comment naming the ceiling and upgrade path.
2945

.clinerules/ponytail.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,21 @@ Before writing any code, stop at the first rung that holds:
1414

1515
The ladder runs after you understand the problem, not instead of it: read the task and the code it touches, trace the real flow end to end, then climb.
1616

17+
Scope before simplicity:
18+
19+
- Lock the task's required outcome before simplifying. For bounded/local work,
20+
simplify inside the stated behaviour. For complete/systemic work, preserve
21+
the required end-to-end behaviour, coverage, integration, migration,
22+
documentation, and verification, then simplify within that boundary.
23+
- Target the smallest complete solution, not the smallest diff. Never drop
24+
requested scope, test coverage, validation, error handling, or integration
25+
to reduce lines.
26+
- Test coverage follows the risk and behaviour matrix. One runnable check is a
27+
floor for small non-trivial logic, never a ceiling for a complex test task.
28+
- If a smaller result would only be a temporary patch, say so and do not call
29+
it complete; ask or state the assumption when the intended boundary is
30+
unclear.
31+
1732
Bug fix = root cause, not symptom: a report names a symptom. Grep every caller of the function you touch and fix the shared function once — one guard there is a smaller diff than one per caller, and patching only the path the ticket names leaves a sibling caller still broken.
1833

1934
Rules:
@@ -23,7 +38,8 @@ Rules:
2338
- No boilerplate nobody asked for.
2439
- Deletion over addition. Boring over clever. Fewest files possible.
2540
- 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.
26-
- Question complex requests: "Do you actually need X, or does Y cover it?"
41+
- Question complex requests only after preserving the required boundary:
42+
"Does Y cover X without dropping required behaviour?"
2743
- Pick the edge-case-correct option when two stdlib approaches are the same size, lazy means less code, not the flimsier algorithm.
2844
- Mark deliberate simplifications that cut a real corner with a known ceiling (global lock, O(n²) scan, naive heuristic) with a `ponytail:` comment naming the ceiling and upgrade path.
2945

.cursor/rules/ponytail.mdc

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,21 @@ Before writing any code, stop at the first rung that holds:
2020

2121
The ladder runs after you understand the problem, not instead of it: read the task and the code it touches, trace the real flow end to end, then climb.
2222

23+
Scope before simplicity:
24+
25+
- Lock the task's required outcome before simplifying. For bounded/local work,
26+
simplify inside the stated behaviour. For complete/systemic work, preserve
27+
the required end-to-end behaviour, coverage, integration, migration,
28+
documentation, and verification, then simplify within that boundary.
29+
- Target the smallest complete solution, not the smallest diff. Never drop
30+
requested scope, test coverage, validation, error handling, or integration
31+
to reduce lines.
32+
- Test coverage follows the risk and behaviour matrix. One runnable check is a
33+
floor for small non-trivial logic, never a ceiling for a complex test task.
34+
- If a smaller result would only be a temporary patch, say so and do not call
35+
it complete; ask or state the assumption when the intended boundary is
36+
unclear.
37+
2338
Bug fix = root cause, not symptom: a report names a symptom. Grep every caller of the function you touch and fix the shared function once — one guard there is a smaller diff than one per caller, and patching only the path the ticket names leaves a sibling caller still broken.
2439

2540
Rules:
@@ -29,7 +44,8 @@ Rules:
2944
- No boilerplate nobody asked for.
3045
- Deletion over addition. Boring over clever. Fewest files possible.
3146
- 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.
32-
- Question complex requests: "Do you actually need X, or does Y cover it?"
47+
- Question complex requests only after preserving the required boundary:
48+
"Does Y cover X without dropping required behaviour?"
3349
- Pick the edge-case-correct option when two stdlib approaches are the same size, lazy means less code, not the flimsier algorithm.
3450
- Mark deliberate simplifications that cut a real corner with a known ceiling (global lock, O(n²) scan, naive heuristic) with a `ponytail:` comment naming the ceiling and upgrade path.
3551

.github/copilot-instructions.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,21 @@ Before writing any code, stop at the first rung that holds:
1414

1515
The ladder runs after you understand the problem, not instead of it: read the task and the code it touches, trace the real flow end to end, then climb.
1616

17+
Scope before simplicity:
18+
19+
- Lock the task's required outcome before simplifying. For bounded/local work,
20+
simplify inside the stated behaviour. For complete/systemic work, preserve
21+
the required end-to-end behaviour, coverage, integration, migration,
22+
documentation, and verification, then simplify within that boundary.
23+
- Target the smallest complete solution, not the smallest diff. Never drop
24+
requested scope, test coverage, validation, error handling, or integration
25+
to reduce lines.
26+
- Test coverage follows the risk and behaviour matrix. One runnable check is a
27+
floor for small non-trivial logic, never a ceiling for a complex test task.
28+
- If a smaller result would only be a temporary patch, say so and do not call
29+
it complete; ask or state the assumption when the intended boundary is
30+
unclear.
31+
1732
Bug fix = root cause, not symptom: a report names a symptom. Grep every caller of the function you touch and fix the shared function once — one guard there is a smaller diff than one per caller, and patching only the path the ticket names leaves a sibling caller still broken.
1833

1934
Rules:
@@ -23,7 +38,8 @@ Rules:
2338
- No boilerplate nobody asked for.
2439
- Deletion over addition. Boring over clever. Fewest files possible.
2540
- 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.
26-
- Question complex requests: "Do you actually need X, or does Y cover it?"
41+
- Question complex requests only after preserving the required boundary:
42+
"Does Y cover X without dropping required behaviour?"
2743
- Pick the edge-case-correct option when two stdlib approaches are the same size, lazy means less code, not the flimsier algorithm.
2844
- Mark deliberate simplifications that cut a real corner with a known ceiling (global lock, O(n²) scan, naive heuristic) with a `ponytail:` comment naming the ceiling and upgrade path.
2945

.kiro/steering/ponytail.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,21 @@ Before writing any code, stop at the first rung that holds:
1919

2020
The ladder runs after you understand the problem, not instead of it: read the task and the code it touches, trace the real flow end to end, then climb.
2121

22+
Scope before simplicity:
23+
24+
- Lock the task's required outcome before simplifying. For bounded/local work,
25+
simplify inside the stated behaviour. For complete/systemic work, preserve
26+
the required end-to-end behaviour, coverage, integration, migration,
27+
documentation, and verification, then simplify within that boundary.
28+
- Target the smallest complete solution, not the smallest diff. Never drop
29+
requested scope, test coverage, validation, error handling, or integration
30+
to reduce lines.
31+
- Test coverage follows the risk and behaviour matrix. One runnable check is a
32+
floor for small non-trivial logic, never a ceiling for a complex test task.
33+
- If a smaller result would only be a temporary patch, say so and do not call
34+
it complete; ask or state the assumption when the intended boundary is
35+
unclear.
36+
2237
Bug fix = root cause, not symptom: a report names a symptom. Grep every caller of the function you touch and fix the shared function once — one guard there is a smaller diff than one per caller, and patching only the path the ticket names leaves a sibling caller still broken.
2338

2439
Rules:
@@ -28,7 +43,8 @@ Rules:
2843
- No boilerplate nobody asked for.
2944
- Deletion over addition. Boring over clever. Fewest files possible.
3045
- 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.
31-
- Question complex requests: "Do you actually need X, or does Y cover it?"
46+
- Question complex requests only after preserving the required boundary:
47+
"Does Y cover X without dropping required behaviour?"
3248
- Pick the edge-case-correct option when two stdlib approaches are the same size, lazy means less code, not the flimsier algorithm.
3349
- Mark deliberate simplifications that cut a real corner with a known ceiling (global lock, O(n²) scan, naive heuristic) with a `ponytail:` comment naming the ceiling and upgrade path.
3450

.openclaw/skills/ponytail/SKILL.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,24 @@ ACTIVE EVERY RESPONSE. No drift back to over-building. Still active if
1717
unsure. Off only: "stop ponytail" / "normal mode". Default: **full**.
1818
Switch: `/ponytail lite|full|ultra`.
1919

20+
## Scope before simplicity
21+
22+
Before climbing the ladder, lock the task's required outcome and classify its
23+
scope:
24+
25+
- **Bounded/local:** simplify freely inside the stated behaviour.
26+
- **Complete/systemic:** preserve the end-to-end behaviour, coverage,
27+
integration, migration, documentation, and verification the task requires;
28+
then simplify the implementation inside that boundary.
29+
30+
The target is the **smallest complete solution**, not the smallest diff. Never
31+
drop requested scope, test coverage, validation, error handling, or integration
32+
just to reduce lines. For tests, coverage follows the risk and behaviour
33+
matrix: the one-check rule is a floor for small non-trivial logic, never a
34+
ceiling for a complex test task. If a smaller result would only be a temporary
35+
patch, say so and do not present it as complete; ask or state the assumption
36+
when the intended boundary is unclear.
37+
2038
## The ladder
2139

2240
Stop at the first rung that holds:
@@ -47,7 +65,9 @@ every sibling caller still broken. Fix it once, where all callers route through.
4765
- No boilerplate, no scaffolding "for later", later can scaffold for itself.
4866
- Deletion over addition. Boring over clever, clever is what someone decodes at 3am.
4967
- 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.
50-
- 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.
68+
- Complex request? Complete the required boundary first, then use the ladder
69+
inside it. Do not silently substitute a temporary patch for the requested
70+
solution; if the boundary is unclear, ask or state the assumption.
5171
- Two stdlib options, same size? Take the one that's correct on edge cases. Lazy means writing less code, not picking the flimsier algorithm.
5272
- Mark deliberate simplifications that cut a real corner with a known ceiling (global lock, O(n²) scan, naive heuristic) with a `ponytail:` comment naming the ceiling and upgrade path (`# ponytail: global lock, per-account locks if throughput matters`).
5373

.qoder/rules/ponytail.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,21 @@ Before writing any code, stop at the first rung that holds:
1414

1515
The ladder runs after you understand the problem, not instead of it: read the task and the code it touches, trace the real flow end to end, then climb.
1616

17+
Scope before simplicity:
18+
19+
- Lock the task's required outcome before simplifying. For bounded/local work,
20+
simplify inside the stated behaviour. For complete/systemic work, preserve
21+
the required end-to-end behaviour, coverage, integration, migration,
22+
documentation, and verification, then simplify within that boundary.
23+
- Target the smallest complete solution, not the smallest diff. Never drop
24+
requested scope, test coverage, validation, error handling, or integration
25+
to reduce lines.
26+
- Test coverage follows the risk and behaviour matrix. One runnable check is a
27+
floor for small non-trivial logic, never a ceiling for a complex test task.
28+
- If a smaller result would only be a temporary patch, say so and do not call
29+
it complete; ask or state the assumption when the intended boundary is
30+
unclear.
31+
1732
Bug fix = root cause, not symptom: a report names a symptom. Grep every caller of the function you touch and fix the shared function once — one guard there is a smaller diff than one per caller, and patching only the path the ticket names leaves a sibling caller still broken.
1833

1934
Rules:
@@ -23,7 +38,8 @@ Rules:
2338
- No boilerplate nobody asked for.
2439
- Deletion over addition. Boring over clever. Fewest files possible.
2540
- 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.
26-
- Question complex requests: "Do you actually need X, or does Y cover it?"
41+
- Question complex requests only after preserving the required boundary:
42+
"Does Y cover X without dropping required behaviour?"
2743
- Pick the edge-case-correct option when two stdlib approaches are the same size, lazy means less code, not the flimsier algorithm.
2844
- Mark deliberate simplifications that cut a real corner with a known ceiling (global lock, O(n²) scan, naive heuristic) with a `ponytail:` comment naming the ceiling and upgrade path.
2945

.windsurf/rules/ponytail.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,21 @@ Before writing any code, stop at the first rung that holds:
1414

1515
The ladder runs after you understand the problem, not instead of it: read the task and the code it touches, trace the real flow end to end, then climb.
1616

17+
Scope before simplicity:
18+
19+
- Lock the task's required outcome before simplifying. For bounded/local work,
20+
simplify inside the stated behaviour. For complete/systemic work, preserve
21+
the required end-to-end behaviour, coverage, integration, migration,
22+
documentation, and verification, then simplify within that boundary.
23+
- Target the smallest complete solution, not the smallest diff. Never drop
24+
requested scope, test coverage, validation, error handling, or integration
25+
to reduce lines.
26+
- Test coverage follows the risk and behaviour matrix. One runnable check is a
27+
floor for small non-trivial logic, never a ceiling for a complex test task.
28+
- If a smaller result would only be a temporary patch, say so and do not call
29+
it complete; ask or state the assumption when the intended boundary is
30+
unclear.
31+
1732
Bug fix = root cause, not symptom: a report names a symptom. Grep every caller of the function you touch and fix the shared function once — one guard there is a smaller diff than one per caller, and patching only the path the ticket names leaves a sibling caller still broken.
1833

1934
Rules:
@@ -23,7 +38,8 @@ Rules:
2338
- No boilerplate nobody asked for.
2439
- Deletion over addition. Boring over clever. Fewest files possible.
2540
- 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.
26-
- Question complex requests: "Do you actually need X, or does Y cover it?"
41+
- Question complex requests only after preserving the required boundary:
42+
"Does Y cover X without dropping required behaviour?"
2743
- Pick the edge-case-correct option when two stdlib approaches are the same size, lazy means less code, not the flimsier algorithm.
2844
- Mark deliberate simplifications that cut a real corner with a known ceiling (global lock, O(n²) scan, naive heuristic) with a `ponytail:` comment naming the ceiling and upgrade path.
2945

AGENTS.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,21 @@ Before writing any code, stop at the first rung that holds:
1414

1515
The ladder runs after you understand the problem, not instead of it: read the task and the code it touches, trace the real flow end to end, then climb.
1616

17+
Scope before simplicity:
18+
19+
- Lock the task's required outcome before simplifying. For bounded/local work,
20+
simplify inside the stated behaviour. For complete/systemic work, preserve
21+
the required end-to-end behaviour, coverage, integration, migration,
22+
documentation, and verification, then simplify within that boundary.
23+
- Target the smallest complete solution, not the smallest diff. Never drop
24+
requested scope, test coverage, validation, error handling, or integration
25+
to reduce lines.
26+
- Test coverage follows the risk and behaviour matrix. One runnable check is a
27+
floor for small non-trivial logic, never a ceiling for a complex test task.
28+
- If a smaller result would only be a temporary patch, say so and do not call
29+
it complete; ask or state the assumption when the intended boundary is
30+
unclear.
31+
1732
Bug fix = root cause, not symptom: a report names a symptom. Grep every caller of the function you touch and fix the shared function once — one guard there is a smaller diff than one per caller, and patching only the path the ticket names leaves a sibling caller still broken.
1833

1934
Rules:
@@ -23,7 +38,8 @@ Rules:
2338
- No boilerplate nobody asked for.
2439
- Deletion over addition. Boring over clever. Fewest files possible.
2540
- 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.
26-
- Question complex requests: "Do you actually need X, or does Y cover it?"
41+
- Question complex requests only after preserving the required boundary:
42+
"Does Y cover X without dropping required behaviour?"
2743
- Pick the edge-case-correct option when two stdlib approaches are the same size, lazy means less code, not the flimsier algorithm.
2844
- Mark deliberate simplifications that cut a real corner with a known ceiling (global lock, O(n²) scan, naive heuristic) with a `ponytail:` comment naming the ceiling and upgrade path.
2945

0 commit comments

Comments
 (0)