You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .opencode/skills/implementation/SKILL.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -135,7 +135,7 @@ Only write an ADR if the decision is non-obvious or has meaningful trade-offs. R
135
135
Apply to the stub files just written:
136
136
137
137
-[ ] No class with >2 responsibilities (SOLID-S)
138
-
-[ ] No class with >2 instance variables (OC-8)
138
+
-[ ] No behavioural class with >2 instance variables (OC-8; dataclasses, Pydantic models, value objects, and TypedDicts are exempt)
139
139
-[ ] All external deps assigned a Protocol (SOLID-D + Hexagonal) — N/A if no external dependencies identified in scope
140
140
-[ ] No noun with different meaning across modules (DDD Bounded Context)
141
141
-[ ] No missing Creational pattern: repeated construction without Factory/Builder
@@ -254,7 +254,7 @@ As a software-engineer I declare:
254
254
* OC-5: one dot per line — AGREE/DISAGREE | file:line
255
255
* OC-6: no abbreviations — AGREE/DISAGREE | file:line
256
256
* OC-7: ≤20 lines per function, ≤50 per class — AGREE/DISAGREE | longest: file:line
257
-
* OC-8: ≤2 instance variables per class — AGREE/DISAGREE | file:line
257
+
* OC-8: ≤2 instance variables per class (behavioural classes only; dataclasses, Pydantic models, value objects, and TypedDicts are exempt) — AGREE/DISAGREE | file:line
258
258
* OC-9: no getters/setters — AGREE/DISAGREE | file:line
259
259
* Patterns: no creational smell — AGREE/DISAGREE | file:line
260
260
* Patterns: no structural smell — AGREE/DISAGREE | file:line
| OC-8 | ≤ 2 instance variables per class |`__init__` with 3+ `self.x =` assignments |
294
+
| OC-8 | ≤ 2 instance variables per class *(behavioural classes only; dataclasses, Pydantic models, value objects, and TypedDicts are exempt)*|`__init__` with 3+ `self.x =` assignments in a behavioural class|
Copy file name to clipboardExpand all lines: AGENTS.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -95,7 +95,7 @@ docs/architecture/
95
95
96
96
tests/
97
97
features/<feature-name>/
98
-
<rule-slug>_test.py ← one per Rule: block, software-engineer-written
98
+
<rule_slug>_test.py ← one per Rule: block, software-engineer-written
99
99
unit/
100
100
<anything>_test.py ← software-engineer-authored extras (no @id traceability)
101
101
```
@@ -109,7 +109,7 @@ Tests in `tests/unit/` are software-engineer-authored extras not covered by any
109
109
## Test File Layout
110
110
111
111
```
112
-
tests/features/<feature-name>/<rule-slug>_test.py
112
+
tests/features/<feature-name>/<rule_slug>_test.py
113
113
```
114
114
115
115
### Function Naming
@@ -177,7 +177,7 @@ uv run task doc-serve
177
177
-**Function length**: ≤ 20 lines
178
178
-**Class length**: ≤ 50 lines
179
179
-**Max nesting**: 2 levels
180
-
-**Instance variables**: ≤ 2 per class
180
+
-**Instance variables**: ≤ 2 per class*(exception: dataclasses, Pydantic models, value objects, and TypedDicts are exempt — they may carry as many fields as the domain requires)*
181
181
-**Semantic alignment**: tests must operate at the same abstraction level as the acceptance criteria they cover
182
182
-**Integration tests**: multi-component features require at least one test in `tests/features/` that exercises the public entry point end-to-end
@@ -259,7 +266,7 @@ Each step has a designated agent and a specific deliverable. No step is skipped.
259
266
│ * OC-5: one dot per line — AGREE/DISAGREE | file:line │
260
267
│ * OC-6: no abbreviations — AGREE/DISAGREE | file:line │
261
268
│ * OC-7: ≤20 lines per function — AGREE/DISAGREE | file:line │
262
-
│ * OC-8: ≤2 instance variables per class — AGREE/DISAGREE | file:line │
269
+
│ * OC-8: ≤2 instance variables per class (behavioural classes only; dataclasses, Pydantic models, value objects, and TypedDicts are exempt) — AGREE/DISAGREE | file:line │
263
270
│ * OC-9: no getters/setters — AGREE/DISAGREE | file:line │
@@ -493,7 +500,7 @@ As a software-engineer I declare:
493
500
* OC-5: one dot per line — AGREE/DISAGREE | file:line
494
501
* OC-6: no abbreviations — AGREE/DISAGREE | file:line
495
502
* OC-7: ≤20 lines per function, ≤50 per class — AGREE/DISAGREE | longest: file:line
496
-
* OC-8: ≤2 instance variables per class — AGREE/DISAGREE | file:line
503
+
* OC-8: ≤2 instance variables per class (behavioural classes only; dataclasses, Pydantic models, value objects, and TypedDicts are exempt) — AGREE/DISAGREE | file:line
497
504
* OC-9: no getters/setters — AGREE/DISAGREE | file:line
498
505
* Patterns: no creational smell — AGREE/DISAGREE | file:line
499
506
* Patterns: no structural smell — AGREE/DISAGREE | file:line
@@ -534,7 +541,7 @@ As a software-engineer I declare:
534
541
| Function length | ≤ 20 lines |
535
542
| Class length | ≤ 50 lines |
536
543
| Max nesting | 2 levels |
537
-
| Instance variables per class | ≤ 2 |
544
+
| Instance variables per class | ≤ 2 (behavioural classes only; dataclasses, Pydantic models, value objects, TypedDicts are exempt) |
0 commit comments