devflow-kit 3.12.1 → 3.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +25 -0
- package/dist/agents/architect.md +10 -9
- package/dist/agents/code.md +11 -11
- package/dist/agents/design.md +7 -7
- package/dist/agents/harden.md +12 -14
- package/dist/agents/review.md +5 -6
- package/dist/cli/commands/init-seed.js +5 -1
- package/dist/cli/commands/init.js +27 -19
- package/dist/cli/commands/tdd.js +230 -0
- package/dist/cli/commands/uninstall.js +2 -2
- package/dist/cli.js +2 -0
- package/dist/commands/implement.md +11 -9
- package/dist/commands/plan.md +23 -61
- package/dist/compliance-off/commands/implement.md +11 -9
- package/dist/compliance-off/commands/plan.md +23 -61
- package/dist/compliance-off/skills/git/references/tracker/github/ensure-pr-ready.md +1 -0
- package/dist/compliance-off/skills/git/references/tracker/jira/ensure-pr-ready.md +1 -0
- package/dist/compliance-off/skills/git/references/tracker/linear/ensure-pr-ready.md +1 -0
- package/dist/compliance-tdd-off/agents/triage.md +173 -0
- package/dist/core/assets.js +40 -33
- package/dist/core/curation-variants.js +191 -76
- package/dist/core/feature-switch.js +3 -2
- package/dist/core/installed-variants.js +45 -14
- package/dist/core/manifest.js +3 -0
- package/dist/core/mds-variants.js +13 -6
- package/dist/core/plugins.js +38 -9
- package/dist/curation-compliance-off/commands/implement.md +11 -9
- package/dist/curation-compliance-off/commands/plan.md +23 -61
- package/dist/curation-compliance-tdd-off/agents/triage.md +170 -0
- package/dist/curation-off/agents/architect.md +10 -9
- package/dist/curation-off/agents/code.md +11 -11
- package/dist/curation-off/agents/design.md +7 -7
- package/dist/curation-off/agents/harden.md +12 -14
- package/dist/curation-off/agents/review.md +5 -6
- package/dist/curation-off/commands/implement.md +11 -9
- package/dist/curation-off/commands/plan.md +23 -61
- package/dist/curation-tdd-off/agents/code.md +173 -0
- package/dist/curation-tdd-off/agents/triage.md +171 -0
- package/dist/skills/git/references/tracker/github/ensure-pr-ready.md +1 -0
- package/dist/skills/git/references/tracker/jira/ensure-pr-ready.md +1 -0
- package/dist/skills/git/references/tracker/linear/ensure-pr-ready.md +1 -0
- package/dist/targets/claude-code/agent-type-owner.js +20 -15
- package/dist/targets/claude-code/curation-install.js +120 -99
- package/dist/targets/claude-code/installer.js +26 -29
- package/dist/targets/claude-code/shipped-set.js +2 -3
- package/dist/tdd-off/agents/code.md +176 -0
- package/dist/tdd-off/agents/triage.md +174 -0
- package/dist/variant-axes.json +54 -27
- package/package.json +1 -1
- package/src/assets/agents/_partials/_design.mds +7 -7
- package/src/assets/agents/architect.mds +3 -2
- package/src/assets/agents/code.mds +24 -12
- package/src/assets/agents/harden.mds +12 -14
- package/src/assets/agents/plan.md +63 -0
- package/src/assets/agents/review.mds +5 -6
- package/src/assets/agents/triage.mds +4 -0
- package/src/assets/commands/implement.mds +12 -10
- package/src/assets/commands/plan.mds +22 -68
- package/src/assets/mds/git/_ops_steps.mds +1 -0
- package/src/assets/skills/agent-references/references/commands/plan-levels.md +3 -3
- package/src/assets/skills/agent-references/references/synthesize/planning.md +9 -9
- package/src/assets/skills/design-review/SKILL.md +9 -12
- package/src/assets/skills/design-review/references/anti-patterns.md +4 -1
- package/src/assets/skills/gap-analysis/SKILL.md +2 -2
- package/src/assets/skills/git/references/patterns.md +3 -0
- package/src/assets/skills/patterns/SKILL.md +2 -4
- package/src/assets/skills/quality-gates/SKILL.md +2 -2
- package/src/assets/skills/quality-gates/references/patterns.md +3 -3
- package/src/assets/skills/quality-gates/references/report-template.md +2 -2
- package/src/assets/skills/quality-gates/references/violations.md +5 -5
- package/src/assets/skills/test-driven-development/SKILL.md +5 -5
- package/src/assets/skills/test-driven-development/references/rationalization-prevention.md +1 -1
- package/src/assets/skills/testing/SKILL.md +9 -9
- package/src/assets/skills/testing/references/report-template.md +1 -1
- package/src/assets/skills/testing/references/violations.md +1 -1
|
@@ -7,8 +7,6 @@ allowed-tools: Read, Grep, Glob
|
|
|
7
7
|
|
|
8
8
|
# Design Review
|
|
9
9
|
|
|
10
|
-
Anti-pattern detection for implementation plans.
|
|
11
|
-
|
|
12
10
|
## Iron Law
|
|
13
11
|
|
|
14
12
|
> **CATCH IT IN THE PLAN, NOT IN THE PR**
|
|
@@ -19,13 +17,13 @@ Anti-pattern detection for implementation plans.
|
|
|
19
17
|
|
|
20
18
|
## Anti-Pattern Detection Rules
|
|
21
19
|
|
|
20
|
+
A concrete case is an external call in this change, a stated or measured hot path, or a repeated delivery.
|
|
21
|
+
|
|
22
22
|
### 1. N+1 Queries
|
|
23
23
|
|
|
24
24
|
**What to look for in a plan:**
|
|
25
25
|
- Steps that fetch a list, then loop to fetch related data per item
|
|
26
|
-
- "For each X, get Y" language
|
|
27
|
-
- JOIN or batch-fetch never mentioned for related data
|
|
28
|
-
- "Display X with Y" without specifying how Y is fetched
|
|
26
|
+
- "For each X, get Y" or "Display X with Y" language, with no JOIN or batch fetch named
|
|
29
27
|
|
|
30
28
|
**How to flag:**
|
|
31
29
|
```
|
|
@@ -41,7 +39,7 @@ Resolution: Replace loop with batch query: {proposed batch operation}.
|
|
|
41
39
|
- Single step handling more than 3 distinct responsibilities
|
|
42
40
|
- "Validate AND process AND notify AND log AND update" in one step
|
|
43
41
|
- Steps described as "the main handler" that touch multiple subsystems
|
|
44
|
-
- No
|
|
42
|
+
- No one-sentence description of what the function does
|
|
45
43
|
|
|
46
44
|
**How to flag:**
|
|
47
45
|
```
|
|
@@ -54,8 +52,7 @@ Resolution: Split into: {responsibility 1} → {responsibility 2} → {responsib
|
|
|
54
52
|
### 3. Missing Parallelism
|
|
55
53
|
|
|
56
54
|
**What to look for in a plan:**
|
|
57
|
-
- Sequential steps with no data dependency between them
|
|
58
|
-
- "First do A, then do B, then do C" where B doesn't need A's output
|
|
55
|
+
- Sequential steps with no data dependency between them ("First do A, then B, then C")
|
|
59
56
|
- Multiple external API calls or DB queries listed sequentially
|
|
60
57
|
- Fan-out operations (notify all users, update all records) without parallel mention
|
|
61
58
|
|
|
@@ -72,9 +69,9 @@ Resolution: Execute {step A} and {step B} in parallel: {proposed parallel patter
|
|
|
72
69
|
**What to look for in a plan:**
|
|
73
70
|
- Happy path fully described, failure paths absent or vague
|
|
74
71
|
- "If error, return error" without specifying what the caller does with it
|
|
75
|
-
- Partial operations (multi-step) without rollback plan
|
|
72
|
+
- Partial operations (multi-step) that can lose data, without rollback plan
|
|
76
73
|
- External calls (API, DB, queue) without failure mode specification
|
|
77
|
-
- Retry
|
|
74
|
+
- Retry or compensation absent: a finding only with a concrete case. Error handling at a trust boundary or for data loss needs no case.
|
|
78
75
|
|
|
79
76
|
**How to flag:**
|
|
80
77
|
```
|
|
@@ -82,12 +79,12 @@ Resolution: Execute {step A} and {step B} in parallel: {proposed parallel patter
|
|
|
82
79
|
Resolution: Add: {on failure scenario} → {specific recovery action}.
|
|
83
80
|
```
|
|
84
81
|
|
|
85
|
-
**Suggest:** for each external call, the action on timeout, 4xx and 5xx; a compensation step for
|
|
82
|
+
**Suggest:** for each external call, the action on timeout, 4xx and 5xx; a compensation step only for a partial write that loses data; Result types or explicit error returns, never a silent failure.
|
|
86
83
|
|
|
87
84
|
### 5. Missing Caching
|
|
88
85
|
|
|
89
86
|
**What to look for in a plan:**
|
|
90
|
-
|
|
87
|
+
Only with a concrete case; else no finding.
|
|
91
88
|
- "Fetch configuration on each request", "call third-party API per user action"
|
|
92
89
|
- Reference data (categories, settings, permissions) loaded repeatedly
|
|
93
90
|
- Computed aggregates recalculated on every read
|
|
@@ -101,6 +101,8 @@ Step 5: Build user dashboard
|
|
|
101
101
|
|
|
102
102
|
## 4. Error Handling Gaps
|
|
103
103
|
|
|
104
|
+
A retry or compensation finding needs a concrete case. Here it is the S3 and database calls of this change.
|
|
105
|
+
|
|
104
106
|
### Before (Anti-Pattern)
|
|
105
107
|
```
|
|
106
108
|
Step 7: Implement file upload
|
|
@@ -126,13 +128,14 @@ Step 7: Implement file upload
|
|
|
126
128
|
- Queue cleanup job to delete orphaned S3 object
|
|
127
129
|
- Return 500, log error with S3 key for manual cleanup if queue fails
|
|
128
130
|
- Return 201 with file URL and metadata
|
|
129
|
-
- Idempotency: if file with same hash already exists for user, return existing URL (no duplicate upload)
|
|
130
131
|
```
|
|
131
132
|
|
|
132
133
|
---
|
|
133
134
|
|
|
134
135
|
## 5. Missing Caching
|
|
135
136
|
|
|
137
|
+
A caching finding needs a concrete case. Here it is three calls on every request, at 1000 req/s.
|
|
138
|
+
|
|
136
139
|
### Before (Anti-Pattern)
|
|
137
140
|
```
|
|
138
141
|
Step 2: Load application configuration
|
|
@@ -59,7 +59,7 @@ Domain expertise for detecting gaps in design documents, specifications, and pla
|
|
|
59
59
|
|
|
60
60
|
**Detection patterns:**
|
|
61
61
|
- N+1 patterns implied — loop-based data fetching without batch operation specified
|
|
62
|
-
- Missing caching strategy — repeated expensive
|
|
62
|
+
- Missing caching strategy — repeated expensive calls on a stated or measured hot path, without cache layer
|
|
63
63
|
- Concurrency concerns — shared mutable state accessed without locking or isolation strategy
|
|
64
64
|
- Query patterns — filtering/sorting on unindexed fields implied by the feature
|
|
65
65
|
- Unbounded result sets — list operations without pagination or size limits
|
|
@@ -101,5 +101,5 @@ Domain expertise for detecting gaps in design documents, specifications, and pla
|
|
|
101
101
|
|-------|----------|----------|
|
|
102
102
|
| **CRITICAL** | Gap that will cause data loss, security breach, or system failure | Missing auth on sensitive endpoint, undefined error recovery for financial transaction |
|
|
103
103
|
| **HIGH** | Gap that will cause incorrect behavior or significant technical debt | Missing pagination on unbounded list, undefined race condition in concurrent update |
|
|
104
|
-
| **MEDIUM** | Gap that will require rework if unaddressed | Vague acceptance criteria, missing caching
|
|
104
|
+
| **MEDIUM** | Gap that will require rework if unaddressed | Vague acceptance criteria, missing caching on a stated hot path |
|
|
105
105
|
| **LOW** | Gap that is an improvement opportunity | Naming inconsistency, minor UX ambiguity with obvious resolution |
|
|
@@ -233,6 +233,9 @@ git commit -m "refactor(utils): simplify string helper functions"
|
|
|
233
233
|
### Testing Gaps
|
|
234
234
|
{Honest assessment}
|
|
235
235
|
|
|
236
|
+
## Known Limits
|
|
237
|
+
{Accepted risks and deferred items, one line each, or "None"}
|
|
238
|
+
|
|
236
239
|
## Related Issues
|
|
237
240
|
Closes #{issue}
|
|
238
241
|
|
|
@@ -7,8 +7,6 @@ allowed-tools: Read, Grep, Glob
|
|
|
7
7
|
|
|
8
8
|
# Implementation Patterns
|
|
9
9
|
|
|
10
|
-
Reference for common implementation patterns.
|
|
11
|
-
|
|
12
10
|
## Iron Law
|
|
13
11
|
|
|
14
12
|
> **FOLLOW EXISTING PATTERNS**
|
|
@@ -35,7 +33,7 @@ A bad parameter returns 400 and a failed authentication 401 before any work runs
|
|
|
35
33
|
|
|
36
34
|
**Core pattern**: Validate event -> Process -> Handle errors -> Acknowledge
|
|
37
35
|
|
|
38
|
-
Make
|
|
36
|
+
Make a handler idempotent only when the change has a repeated delivery (a retry, a queue, a webhook). Log an invalid event as a warning and drop it; do not throw.
|
|
39
37
|
|
|
40
38
|
### Configuration
|
|
41
39
|
|
|
@@ -69,7 +67,7 @@ Before implementing, verify:
|
|
|
69
67
|
- [ ] Handling all error cases explicitly
|
|
70
68
|
- [ ] Using transactions for multi-step operations
|
|
71
69
|
- [ ] No hardcoded values (use config)
|
|
72
|
-
- [ ] Input validated at system boundaries;
|
|
70
|
+
- [ ] Input validated at system boundaries; idempotent only for a repeated delivery
|
|
73
71
|
|
|
74
72
|
## Extended References
|
|
75
73
|
|
|
@@ -30,7 +30,7 @@ Does the implementation fit the architecture? Follows existing patterns, respect
|
|
|
30
30
|
If `FEATURE_KNOWLEDGE` is provided (Rules bullets and the KB path, no heading index), verify implementation respects each bullet's anti-pattern, gotcha or invariant; Read a KB section from its path for the architecture. Flag deviations as P0-Design issues when the documented pattern is clearly intentional.
|
|
31
31
|
|
|
32
32
|
### P0 - Functionality
|
|
33
|
-
Does the code work?
|
|
33
|
+
Does the code work? Each acceptance criterion (else each behaviour the diff adds) holds, each named edge case is handled, no race conditions.
|
|
34
34
|
|
|
35
35
|
### P0 - Security
|
|
36
36
|
Any vulnerabilities? No injection, input validated, no hardcoded secrets, no secrets or tokens in logs or debug output, auth checked.
|
|
@@ -42,7 +42,7 @@ Understandable in 5 minutes? Functions < 50 lines, nesting < 4 levels, no magic
|
|
|
42
42
|
Errors handled explicitly? No swallowed exceptions, helpful messages, resources cleaned up.
|
|
43
43
|
|
|
44
44
|
### P1 - Tests
|
|
45
|
-
New code tested?
|
|
45
|
+
New code tested? A test for each acceptance-criterion behaviour (else each behaviour the diff adds) and for each trust-boundary, data-loss, security or fail-closed path; an edge-case test only for a named case. Tests behavior, not implementation.
|
|
46
46
|
|
|
47
47
|
### P2 - Documentation
|
|
48
48
|
Will others understand? Complex logic commented, public APIs documented, no outdated comments.
|
|
@@ -11,7 +11,7 @@ For each pillar, ask:
|
|
|
11
11
|
| Pillar | Key Questions |
|
|
12
12
|
|--------|---------------|
|
|
13
13
|
| Design | Does this follow existing patterns? Is it maintainable? |
|
|
14
|
-
| Functionality | Does it meet requirements? Handle edge cases? |
|
|
14
|
+
| Functionality | Does it meet requirements? Handle named edge cases? |
|
|
15
15
|
| Security | Is input validated? Auth checked? Data protected? |
|
|
16
16
|
| Complexity | Can someone understand this in 5 minutes? |
|
|
17
17
|
| Error Handling | Are errors handled with Result types? Logged? |
|
|
@@ -191,7 +191,7 @@ try {
|
|
|
191
191
|
|
|
192
192
|
### 6. Tests - Correct Patterns
|
|
193
193
|
|
|
194
|
-
**Fix Pattern**: Add
|
|
194
|
+
**Fix Pattern**: Add a test for each acceptance-criterion behaviour, test behavior not mocks, cover named edge cases.
|
|
195
195
|
|
|
196
196
|
```typescript
|
|
197
197
|
// GOOD: Testing behavior
|
|
@@ -213,7 +213,7 @@ describe('createUser', () => {
|
|
|
213
213
|
});
|
|
214
214
|
});
|
|
215
215
|
|
|
216
|
-
// GOOD:
|
|
216
|
+
// GOOD: A test for the named edge case
|
|
217
217
|
describe('divide', () => {
|
|
218
218
|
it('divides positive numbers', () => {
|
|
219
219
|
expect(divide(10, 2)).toBe(5);
|
|
@@ -90,7 +90,7 @@ Add user profile update endpoint
|
|
|
90
90
|
| Pillar | Status | Notes |
|
|
91
91
|
|--------|--------|-------|
|
|
92
92
|
| Design | PASS | Follows existing route/service pattern |
|
|
93
|
-
| Functionality | PASS |
|
|
93
|
+
| Functionality | PASS | Named edge cases handled |
|
|
94
94
|
| Security | PASS | Auth middleware in place, input validated |
|
|
95
95
|
|
|
96
96
|
---
|
|
@@ -101,7 +101,7 @@ Add user profile update endpoint
|
|
|
101
101
|
|--------|--------|-------|
|
|
102
102
|
| Complexity | PASS | Functions under 30 lines |
|
|
103
103
|
| Error Handling | PASS | Uses Result types consistently |
|
|
104
|
-
| Tests | PASS |
|
|
104
|
+
| Tests | PASS | Each acceptance-criterion behaviour covered |
|
|
105
105
|
|
|
106
106
|
---
|
|
107
107
|
|
|
@@ -79,7 +79,7 @@ for (let i = 0; i <= array.length; i++) { // Should be < not <=
|
|
|
79
79
|
|
|
80
80
|
**Checklist**:
|
|
81
81
|
- [ ] Happy path works correctly
|
|
82
|
-
- [ ]
|
|
82
|
+
- [ ] Named edge cases handled (null, empty, boundary values)
|
|
83
83
|
- [ ] Error cases handled gracefully
|
|
84
84
|
- [ ] No race conditions in concurrent code
|
|
85
85
|
- [ ] No infinite loops or recursion without base case
|
|
@@ -204,7 +204,7 @@ it('creates user', async () => {
|
|
|
204
204
|
expect(mockDb.insert).toHaveBeenCalled(); // Only checks mock was called
|
|
205
205
|
});
|
|
206
206
|
|
|
207
|
-
// BAD:
|
|
207
|
+
// BAD: No test for a named edge case (division by zero)
|
|
208
208
|
describe('divide', () => {
|
|
209
209
|
it('divides numbers', () => {
|
|
210
210
|
expect(divide(10, 2)).toBe(5);
|
|
@@ -215,9 +215,9 @@ describe('divide', () => {
|
|
|
215
215
|
|
|
216
216
|
**Checklist**:
|
|
217
217
|
- [ ] New code has corresponding tests
|
|
218
|
-
- [ ] Tests cover
|
|
219
|
-
- [ ] Tests cover
|
|
220
|
-
- [ ]
|
|
218
|
+
- [ ] Tests cover each acceptance-criterion behaviour
|
|
219
|
+
- [ ] Tests cover each trust-boundary, data-loss, security and fail-closed path
|
|
220
|
+
- [ ] Edge-case tests exist only for named cases
|
|
221
221
|
- [ ] Tests are not brittle (test behavior, not implementation)
|
|
222
222
|
- [ ] Tests would fail if code breaks
|
|
223
223
|
|
|
@@ -19,7 +19,7 @@ activation:
|
|
|
19
19
|
|
|
20
20
|
# Test-Driven Development
|
|
21
21
|
|
|
22
|
-
Use the RED-GREEN-REFACTOR cycle for all implementation work.
|
|
22
|
+
Use the RED-GREEN-REFACTOR cycle for all implementation work. Refactoring improves the design without changing behavior.
|
|
23
23
|
|
|
24
24
|
## Iron Law
|
|
25
25
|
|
|
@@ -43,7 +43,7 @@ Write a test that describes the behavior you want. Run it. Watch it fail. The fa
|
|
|
43
43
|
|
|
44
44
|
Write the simplest production code that makes the failing test pass. Hardcode first if that is simplest; generalize when the next test forces it. No code for later, no optimizing, no cleanup.
|
|
45
45
|
|
|
46
|
-
**Checkpoint:** All affected tests pass.
|
|
46
|
+
**Checkpoint:** All affected tests pass.
|
|
47
47
|
|
|
48
48
|
### Step 3: REFACTOR — Improve Without Changing Behavior
|
|
49
49
|
|
|
@@ -78,12 +78,12 @@ An excuse to skip the test-first step is a rationalization: reject it. `referenc
|
|
|
78
78
|
|
|
79
79
|
## What to Test
|
|
80
80
|
|
|
81
|
-
Follow the project's test layout
|
|
81
|
+
Follow the project's test layout, and import the module under test, not its helpers.
|
|
82
82
|
|
|
83
83
|
| Test | Don't Test |
|
|
84
84
|
|------|------------|
|
|
85
85
|
| Public API behavior | Private implementation details |
|
|
86
|
-
|
|
|
86
|
+
| Trust-boundary, data-loss, security and fail-closed paths; named edge cases | Framework internals |
|
|
87
87
|
| Integration points (boundaries) | Third-party library correctness |
|
|
88
88
|
| State transitions | Getter/setter plumbing (unless non-trivial) |
|
|
89
89
|
|
|
@@ -98,7 +98,7 @@ When you skip TDD, state the reason from this list: "Skipping TDD because: [reas
|
|
|
98
98
|
|
|
99
99
|
## By Mode
|
|
100
100
|
|
|
101
|
-
- **IMPLEMENT**: write the failing test before production code, one behavior at a time.
|
|
101
|
+
- **IMPLEMENT**: write the failing test before production code, one behavior at a time.
|
|
102
102
|
- **DEBUG**: write a test that reproduces the bug first, then fix.
|
|
103
103
|
- **PLAN**: the plan has a test strategy and orders test files first.
|
|
104
104
|
- **RESOLVE**: the Code agent (issue-fix mode) writes a failing-then-passing regression test for every fix.
|
|
@@ -7,7 +7,7 @@ The excuses table, the mid-work red flags, a test-first example, and detailed co
|
|
|
7
7
|
| Excuse | Why It Feels Right | Why It's Wrong | Correct Action |
|
|
8
8
|
|--------|-------------------|----------------|----------------|
|
|
9
9
|
| "I'll write tests after" | Need to see the shape first | Tests ARE the shape — they define the interface before implementation exists | Write the test first |
|
|
10
|
-
| "Too simple to test" | It's just a getter/setter | Getters break
|
|
10
|
+
| "Too simple to test" | It's just a getter/setter | Getters break and defaults change; code with an acceptance-criterion behaviour always gets its test | Test that behaviour — takes 30 seconds |
|
|
11
11
|
| "I'll refactor later" | Just get it working now | "Later" never comes; technical debt compounds silently | Refactor now in Step 3 |
|
|
12
12
|
| "Test is too hard to write" or "the test setup is too complex" | Mocking is painful | Hard-to-test code = bad design, and complex setup = too much coupling; the test is telling you the interface is wrong | Simplify the interface first |
|
|
13
13
|
| "Need to see the whole picture" or "the architecture first" | Can't test what I haven't designed or structured yet | TDD IS design; each test reveals the next piece of the interface, and tests DEFINE the architecture | Let the tests drive the design and structure |
|
|
@@ -30,7 +30,7 @@ activation:
|
|
|
30
30
|
|-------|---------|
|
|
31
31
|
| Pyramid | Many unit → fewer integration → fewest E2E |
|
|
32
32
|
| Trophy | Integration tests give best ROI for UI-heavy code |
|
|
33
|
-
| Google | 70% unit / 20% integration / 10% E2E
|
|
33
|
+
| Google | 70% unit / 20% integration / 10% E2E |
|
|
34
34
|
|
|
35
35
|
## Test Doubles Taxonomy
|
|
36
36
|
|
|
@@ -89,8 +89,8 @@ Quarantine flaky tests immediately — a suite that sometimes passes is worse th
|
|
|
89
89
|
| Severity | Criteria |
|
|
90
90
|
|----------|----------|
|
|
91
91
|
| **CRITICAL** | Tests don't verify behavior; critical paths untested; everything mocked |
|
|
92
|
-
| **HIGH** |
|
|
93
|
-
| **MEDIUM** |
|
|
92
|
+
| **HIGH** | Untested trust-boundary, data-loss, security or fail-closed path; flaky tests; slow (>10s); setup >10 lines |
|
|
93
|
+
| **MEDIUM** | Named edge case with no test; weak assertions; unclear AAA structure |
|
|
94
94
|
| **LOW** | Organization; naming clarity |
|
|
95
95
|
|
|
96
96
|
## Test Suite Safety
|
|
@@ -103,17 +103,17 @@ Quarantine flaky tests immediately — a suite that sometimes passes is worse th
|
|
|
103
103
|
|
|
104
104
|
| Reference | Contents |
|
|
105
105
|
|-----------|----------|
|
|
106
|
-
| `references/sources.md` |
|
|
107
|
-
| `references/violations.md` |
|
|
106
|
+
| `references/sources.md` | Bibliography (20 sources) |
|
|
107
|
+
| `references/violations.md` | Violations with citations |
|
|
108
108
|
| `references/patterns.md` | Correct patterns with citations |
|
|
109
|
-
| `references/detection.md` |
|
|
110
|
-
| `references/report-template.md` | Report format
|
|
109
|
+
| `references/detection.md` | Detection commands |
|
|
110
|
+
| `references/report-template.md` | Report format |
|
|
111
111
|
|
|
112
112
|
## Quality Gates
|
|
113
113
|
|
|
114
|
-
- [ ] Setup <10 lines
|
|
114
|
+
- [ ] Setup <10 lines
|
|
115
115
|
- [ ] Each new assertion would fail, not error, with the change reverted: its RED run counts, else a bad input or a temporary uncommitted revert of your own edit, never a stash
|
|
116
|
-
- [ ]
|
|
116
|
+
- [ ] A test for each acceptance-criterion behaviour; an edge-case test only for a named case
|
|
117
117
|
- [ ] Test names describe expected behavior
|
|
118
118
|
- [ ] Tests follow Arrange-Act-Assert structure
|
|
119
119
|
- [ ] No flaky patterns
|
|
@@ -55,7 +55,7 @@ Use this template when reporting test design issues.
|
|
|
55
55
|
|----------|---------|---------|
|
|
56
56
|
| **CRITICAL** | Fundamental design flaws | Complex setup >10 lines, repetitive boilerplate >3 times, mock objects >5 methods, testing private methods |
|
|
57
57
|
| **HIGH** | Maintenance complications | Difficult mocking >20 lines, implementation testing, environment manipulation, database seeding |
|
|
58
|
-
| **MEDIUM** | Reduced clarity | Test helper abuse, inconsistent assertion patterns,
|
|
58
|
+
| **MEDIUM** | Reduced clarity | Test helper abuse, inconsistent assertion patterns, a named edge case with no test |
|
|
59
59
|
| **LOW** | Minor improvements | Organization, naming clarity |
|
|
60
60
|
|
|
61
61
|
---
|