safeword 0.2.3 → 0.2.4
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/.claude/commands/arch-review.md +32 -0
- package/.claude/commands/lint.md +6 -0
- package/.claude/commands/quality-review.md +13 -0
- package/.claude/commands/setup-linting.md +6 -0
- package/.claude/hooks/auto-lint.sh +6 -0
- package/.claude/hooks/auto-quality-review.sh +170 -0
- package/.claude/hooks/check-linting-sync.sh +17 -0
- package/.claude/hooks/inject-timestamp.sh +6 -0
- package/.claude/hooks/question-protocol.sh +12 -0
- package/.claude/hooks/run-linters.sh +8 -0
- package/.claude/hooks/run-quality-review.sh +76 -0
- package/.claude/hooks/version-check.sh +10 -0
- package/.claude/mcp/README.md +96 -0
- package/.claude/mcp/arcade.sample.json +9 -0
- package/.claude/mcp/context7.sample.json +7 -0
- package/.claude/mcp/playwright.sample.json +7 -0
- package/.claude/settings.json +62 -0
- package/.claude/skills/quality-reviewer/SKILL.md +190 -0
- package/.claude/skills/safeword-quality-reviewer/SKILL.md +13 -0
- package/.env.arcade.example +4 -0
- package/.env.example +11 -0
- package/.gitmodules +4 -0
- package/.safeword/SAFEWORD.md +33 -0
- package/.safeword/eslint/eslint-base.mjs +101 -0
- package/.safeword/guides/architecture-guide.md +404 -0
- package/.safeword/guides/code-philosophy.md +174 -0
- package/.safeword/guides/context-files-guide.md +405 -0
- package/.safeword/guides/data-architecture-guide.md +183 -0
- package/.safeword/guides/design-doc-guide.md +165 -0
- package/.safeword/guides/learning-extraction.md +515 -0
- package/.safeword/guides/llm-instruction-design.md +239 -0
- package/.safeword/guides/llm-prompting.md +95 -0
- package/.safeword/guides/tdd-best-practices.md +570 -0
- package/.safeword/guides/test-definitions-guide.md +243 -0
- package/.safeword/guides/testing-methodology.md +573 -0
- package/.safeword/guides/user-story-guide.md +237 -0
- package/.safeword/guides/zombie-process-cleanup.md +214 -0
- package/{templates → .safeword}/hooks/agents-md-check.sh +0 -0
- package/{templates → .safeword}/hooks/post-tool.sh +0 -0
- package/{templates → .safeword}/hooks/pre-commit.sh +0 -0
- package/.safeword/planning/002-user-story-quality-evaluation.md +1840 -0
- package/.safeword/planning/003-langsmith-eval-setup-prompt.md +363 -0
- package/.safeword/planning/004-llm-eval-test-cases.md +3226 -0
- package/.safeword/planning/005-architecture-enforcement-system.md +169 -0
- package/.safeword/planning/006-reactive-fix-prevention-research.md +135 -0
- package/.safeword/planning/011-cli-ux-vision.md +330 -0
- package/.safeword/planning/012-project-structure-cleanup.md +154 -0
- package/.safeword/planning/README.md +39 -0
- package/.safeword/planning/automation-plan-v2.md +1225 -0
- package/.safeword/planning/automation-plan-v3.md +1291 -0
- package/.safeword/planning/automation-plan.md +3058 -0
- package/.safeword/planning/design/005-cli-implementation.md +343 -0
- package/.safeword/planning/design/013-cli-self-contained-templates.md +596 -0
- package/.safeword/planning/design/013a-eslint-plugin-suite.md +256 -0
- package/.safeword/planning/design/013b-implementation-snippets.md +385 -0
- package/.safeword/planning/design/013c-config-isolation-strategy.md +242 -0
- package/.safeword/planning/design/code-philosophy-improvements.md +60 -0
- package/.safeword/planning/mcp-analysis.md +545 -0
- package/.safeword/planning/phase2-subagents-vs-skills-analysis.md +451 -0
- package/.safeword/planning/settings-improvements.md +970 -0
- package/.safeword/planning/test-definitions/005-cli-implementation.md +1301 -0
- package/.safeword/planning/test-definitions/cli-self-contained-templates.md +205 -0
- package/.safeword/planning/user-stories/001-guides-review-user-stories.md +1381 -0
- package/.safeword/planning/user-stories/003-reactive-fix-prevention.md +132 -0
- package/.safeword/planning/user-stories/004-technical-constraints.md +86 -0
- package/.safeword/planning/user-stories/005-cli-implementation.md +311 -0
- package/.safeword/planning/user-stories/cli-self-contained-templates.md +172 -0
- package/.safeword/planning/versioned-distribution.md +740 -0
- package/.safeword/prompts/arch-review.md +43 -0
- package/.safeword/prompts/quality-review.md +11 -0
- package/.safeword/scripts/arch-review.sh +235 -0
- package/.safeword/scripts/check-linting-sync.sh +58 -0
- package/.safeword/scripts/setup-linting.sh +559 -0
- package/.safeword/templates/architecture-template.md +136 -0
- package/.safeword/templates/ci/architecture-check.yml +79 -0
- package/.safeword/templates/design-doc-template.md +127 -0
- package/.safeword/templates/test-definitions-feature.md +100 -0
- package/.safeword/templates/ticket-template.md +74 -0
- package/.safeword/templates/user-stories-template.md +82 -0
- package/.safeword/tickets/001-guides-review-user-stories.md +83 -0
- package/.safeword/tickets/002-architecture-enforcement.md +211 -0
- package/.safeword/tickets/003-reactive-fix-prevention.md +57 -0
- package/.safeword/tickets/004-technical-constraints-in-user-stories.md +39 -0
- package/.safeword/tickets/005-cli-implementation.md +248 -0
- package/.safeword/tickets/006-flesh-out-skills.md +43 -0
- package/.safeword/tickets/007-flesh-out-questioning.md +44 -0
- package/.safeword/tickets/008-upgrade-questioning.md +58 -0
- package/.safeword/tickets/009-naming-conventions.md +41 -0
- package/.safeword/tickets/010-safeword-md-cleanup.md +34 -0
- package/.safeword/tickets/011-cursor-setup.md +86 -0
- package/.safeword/tickets/README.md +73 -0
- package/.safeword/version +1 -0
- package/AGENTS.md +59 -0
- package/CLAUDE.md +12 -0
- package/README.md +347 -0
- package/docs/001-cli-implementation-plan.md +856 -0
- package/docs/elite-dx-implementation-plan.md +1034 -0
- package/framework/README.md +131 -0
- package/framework/mcp/README.md +96 -0
- package/framework/mcp/arcade.sample.json +8 -0
- package/framework/mcp/context7.sample.json +6 -0
- package/framework/mcp/playwright.sample.json +6 -0
- package/framework/scripts/arch-review.sh +235 -0
- package/framework/scripts/check-linting-sync.sh +58 -0
- package/framework/scripts/load-env.sh +49 -0
- package/framework/scripts/setup-claude.sh +223 -0
- package/framework/scripts/setup-linting.sh +559 -0
- package/framework/scripts/setup-quality.sh +477 -0
- package/framework/scripts/setup-safeword.sh +550 -0
- package/framework/templates/ci/architecture-check.yml +78 -0
- package/learnings/ai-sdk-v5-breaking-changes.md +178 -0
- package/learnings/e2e-test-zombie-processes.md +231 -0
- package/learnings/milkdown-crepe-editor-property.md +96 -0
- package/learnings/prosemirror-fragment-traversal.md +119 -0
- package/package.json +19 -43
- package/packages/cli/AGENTS.md +1 -0
- package/packages/cli/ARCHITECTURE.md +279 -0
- package/packages/cli/package.json +51 -0
- package/packages/cli/src/cli.ts +63 -0
- package/packages/cli/src/commands/check.ts +166 -0
- package/packages/cli/src/commands/diff.ts +209 -0
- package/packages/cli/src/commands/reset.ts +190 -0
- package/packages/cli/src/commands/setup.ts +325 -0
- package/packages/cli/src/commands/upgrade.ts +163 -0
- package/packages/cli/src/index.ts +3 -0
- package/packages/cli/src/templates/config.ts +58 -0
- package/packages/cli/src/templates/content.ts +18 -0
- package/packages/cli/src/templates/index.ts +12 -0
- package/packages/cli/src/utils/agents-md.ts +66 -0
- package/packages/cli/src/utils/fs.ts +179 -0
- package/packages/cli/src/utils/git.ts +124 -0
- package/packages/cli/src/utils/hooks.ts +29 -0
- package/packages/cli/src/utils/output.ts +60 -0
- package/packages/cli/src/utils/project-detector.test.ts +185 -0
- package/packages/cli/src/utils/project-detector.ts +44 -0
- package/packages/cli/src/utils/version.ts +28 -0
- package/packages/cli/src/version.ts +6 -0
- package/packages/cli/templates/SAFEWORD.md +776 -0
- package/packages/cli/templates/doc-templates/architecture-template.md +136 -0
- package/packages/cli/templates/doc-templates/design-doc-template.md +134 -0
- package/packages/cli/templates/doc-templates/test-definitions-feature.md +131 -0
- package/packages/cli/templates/doc-templates/ticket-template.md +82 -0
- package/packages/cli/templates/doc-templates/user-stories-template.md +92 -0
- package/packages/cli/templates/guides/architecture-guide.md +423 -0
- package/packages/cli/templates/guides/code-philosophy.md +195 -0
- package/packages/cli/templates/guides/context-files-guide.md +457 -0
- package/packages/cli/templates/guides/data-architecture-guide.md +200 -0
- package/packages/cli/templates/guides/design-doc-guide.md +171 -0
- package/packages/cli/templates/guides/learning-extraction.md +552 -0
- package/packages/cli/templates/guides/llm-instruction-design.md +248 -0
- package/packages/cli/templates/guides/llm-prompting.md +102 -0
- package/packages/cli/templates/guides/tdd-best-practices.md +615 -0
- package/packages/cli/templates/guides/test-definitions-guide.md +334 -0
- package/packages/cli/templates/guides/testing-methodology.md +618 -0
- package/packages/cli/templates/guides/user-story-guide.md +256 -0
- package/packages/cli/templates/guides/zombie-process-cleanup.md +219 -0
- package/packages/cli/templates/hooks/agents-md-check.sh +27 -0
- package/packages/cli/templates/hooks/post-tool.sh +4 -0
- package/packages/cli/templates/hooks/pre-commit.sh +10 -0
- package/packages/cli/templates/prompts/arch-review.md +43 -0
- package/packages/cli/templates/prompts/quality-review.md +10 -0
- package/packages/cli/templates/skills/safeword-quality-reviewer/SKILL.md +207 -0
- package/packages/cli/tests/commands/check.test.ts +129 -0
- package/packages/cli/tests/commands/cli.test.ts +89 -0
- package/packages/cli/tests/commands/diff.test.ts +115 -0
- package/packages/cli/tests/commands/reset.test.ts +310 -0
- package/packages/cli/tests/commands/self-healing.test.ts +170 -0
- package/packages/cli/tests/commands/setup-blocking.test.ts +71 -0
- package/packages/cli/tests/commands/setup-core.test.ts +135 -0
- package/packages/cli/tests/commands/setup-git.test.ts +139 -0
- package/packages/cli/tests/commands/setup-hooks.test.ts +334 -0
- package/packages/cli/tests/commands/setup-linting.test.ts +189 -0
- package/packages/cli/tests/commands/setup-noninteractive.test.ts +80 -0
- package/packages/cli/tests/commands/setup-templates.test.ts +181 -0
- package/packages/cli/tests/commands/upgrade.test.ts +215 -0
- package/packages/cli/tests/helpers.ts +243 -0
- package/packages/cli/tests/npm-package.test.ts +83 -0
- package/packages/cli/tests/technical-constraints.test.ts +96 -0
- package/packages/cli/tsconfig.json +25 -0
- package/packages/cli/tsup.config.ts +11 -0
- package/packages/cli/vitest.config.ts +23 -0
- package/promptfoo.yaml +3270 -0
- package/dist/check-3NGQ4NR5.js +0 -129
- package/dist/check-3NGQ4NR5.js.map +0 -1
- package/dist/chunk-2XWIUEQK.js +0 -190
- package/dist/chunk-2XWIUEQK.js.map +0 -1
- package/dist/chunk-GZRQL3SX.js +0 -146
- package/dist/chunk-GZRQL3SX.js.map +0 -1
- package/dist/chunk-ORQHKDT2.js +0 -10
- package/dist/chunk-ORQHKDT2.js.map +0 -1
- package/dist/chunk-W66Z3C5H.js +0 -21
- package/dist/chunk-W66Z3C5H.js.map +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +0 -34
- package/dist/cli.js.map +0 -1
- package/dist/diff-Y6QTAW4O.js +0 -166
- package/dist/diff-Y6QTAW4O.js.map +0 -1
- package/dist/index.d.ts +0 -11
- package/dist/index.js +0 -7
- package/dist/index.js.map +0 -1
- package/dist/reset-3ACTIYYE.js +0 -143
- package/dist/reset-3ACTIYYE.js.map +0 -1
- package/dist/setup-RR4M334C.js +0 -266
- package/dist/setup-RR4M334C.js.map +0 -1
- package/dist/upgrade-6AR3DHUV.js +0 -134
- package/dist/upgrade-6AR3DHUV.js.map +0 -1
- /package/{templates → framework}/SAFEWORD.md +0 -0
- /package/{templates → framework}/guides/architecture-guide.md +0 -0
- /package/{templates → framework}/guides/code-philosophy.md +0 -0
- /package/{templates → framework}/guides/context-files-guide.md +0 -0
- /package/{templates → framework}/guides/data-architecture-guide.md +0 -0
- /package/{templates → framework}/guides/design-doc-guide.md +0 -0
- /package/{templates → framework}/guides/learning-extraction.md +0 -0
- /package/{templates → framework}/guides/llm-instruction-design.md +0 -0
- /package/{templates → framework}/guides/llm-prompting.md +0 -0
- /package/{templates → framework}/guides/tdd-best-practices.md +0 -0
- /package/{templates → framework}/guides/test-definitions-guide.md +0 -0
- /package/{templates → framework}/guides/testing-methodology.md +0 -0
- /package/{templates → framework}/guides/user-story-guide.md +0 -0
- /package/{templates → framework}/guides/zombie-process-cleanup.md +0 -0
- /package/{templates → framework}/prompts/arch-review.md +0 -0
- /package/{templates → framework}/prompts/quality-review.md +0 -0
- /package/{templates/skills/safeword-quality-reviewer → framework/skills/quality-reviewer}/SKILL.md +0 -0
- /package/{templates/doc-templates → framework/templates}/architecture-template.md +0 -0
- /package/{templates/doc-templates → framework/templates}/design-doc-template.md +0 -0
- /package/{templates/doc-templates → framework/templates}/test-definitions-feature.md +0 -0
- /package/{templates/doc-templates → framework/templates}/ticket-template.md +0 -0
- /package/{templates/doc-templates → framework/templates}/user-stories-template.md +0 -0
- /package/{templates → packages/cli/templates}/commands/arch-review.md +0 -0
- /package/{templates → packages/cli/templates}/commands/lint.md +0 -0
- /package/{templates → packages/cli/templates}/commands/quality-review.md +0 -0
- /package/{templates → packages/cli/templates}/hooks/inject-timestamp.sh +0 -0
- /package/{templates → packages/cli/templates}/lib/common.sh +0 -0
- /package/{templates → packages/cli/templates}/lib/jq-fallback.sh +0 -0
- /package/{templates → packages/cli/templates}/markdownlint.jsonc +0 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
# Test Definitions Guide for Claude Code
|
|
2
|
+
|
|
3
|
+
## How to Fill Out Feature Test Definitions
|
|
4
|
+
|
|
5
|
+
**Template:** `@.safeword/templates/test-definitions-feature.md`
|
|
6
|
+
|
|
7
|
+
**When user asks:** "Create test definitions for issue #N" or "Create test definitions for [feature]"
|
|
8
|
+
|
|
9
|
+
**What you do:**
|
|
10
|
+
|
|
11
|
+
1. Read `@.safeword/templates/test-definitions-feature.md`
|
|
12
|
+
2. Read user story's Technical Constraints section (if exists)
|
|
13
|
+
3. Fill in feature name, issue number, test file path
|
|
14
|
+
4. Organize tests into logical suites (e.g., "Layout Structure", "User Interactions", "Technical Constraints")
|
|
15
|
+
5. Create numbered tests (Test 1.1, Test 1.2, etc.)
|
|
16
|
+
6. Add status for each test (✅/⏭️/❌/🔴)
|
|
17
|
+
7. Include detailed steps and expected outcomes
|
|
18
|
+
8. Add summary with coverage breakdown
|
|
19
|
+
9. Save to project location (e.g., `planning/test-definitions/45-feature-name-test-definitions.md`)
|
|
20
|
+
|
|
21
|
+
**DO include:**
|
|
22
|
+
|
|
23
|
+
- Status tracking per test (✅ Passing / ⏭️ Skipped / ❌ Not Implemented / 🔴 Failing)
|
|
24
|
+
- Detailed steps (numbered list)
|
|
25
|
+
- Expected outcomes (bullet points)
|
|
26
|
+
- Coverage summary with percentages
|
|
27
|
+
- Skipped tests rationale
|
|
28
|
+
- Test execution commands
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Test Status Indicators
|
|
33
|
+
|
|
34
|
+
Use these consistently:
|
|
35
|
+
|
|
36
|
+
- **✅ Passing** - Test is implemented and passing
|
|
37
|
+
- **⏭️ Skipped** - Test is intentionally skipped (add rationale in summary)
|
|
38
|
+
- **❌ Not Implemented** - Test is defined but not yet written
|
|
39
|
+
- **🔴 Failing** - Test exists but is currently failing
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Test Naming Conventions
|
|
44
|
+
|
|
45
|
+
**✅ GOOD - Descriptive and specific:**
|
|
46
|
+
|
|
47
|
+
- "Render all three panes"
|
|
48
|
+
- "Cmd+J toggles AI pane visibility"
|
|
49
|
+
- "State persistence across sessions"
|
|
50
|
+
- "Button appearance reflects pane state"
|
|
51
|
+
|
|
52
|
+
**❌ BAD - Vague or technical:**
|
|
53
|
+
|
|
54
|
+
- "Test 1" (no description)
|
|
55
|
+
- "Check state" (too vague)
|
|
56
|
+
- "Verify useUIStore hook" (implementation detail)
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Writing Test Steps
|
|
61
|
+
|
|
62
|
+
**✅ GOOD - Clear, actionable steps:**
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
**Steps**:
|
|
66
|
+
1. Toggle AI pane visible
|
|
67
|
+
2. Get bounding box for AI pane
|
|
68
|
+
3. Get bounding box for Editor pane
|
|
69
|
+
4. Compare X coordinates
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**❌ BAD - Vague or incomplete:**
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
**Steps**:
|
|
76
|
+
1. Check panes
|
|
77
|
+
2. Verify order
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Writing Expected Outcomes
|
|
83
|
+
|
|
84
|
+
**✅ GOOD - Specific, testable assertions:**
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
**Expected**:
|
|
88
|
+
- AI pane X coordinate < Editor pane X coordinate
|
|
89
|
+
- Explorer pane X coordinate > Editor pane X coordinate
|
|
90
|
+
- All coordinates are positive numbers
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
**❌ BAD - Vague expectations:**
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
**Expected**:
|
|
97
|
+
- Panes are in correct order
|
|
98
|
+
- Everything works
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## Organizing Test Suites
|
|
104
|
+
|
|
105
|
+
**Group related tests into suites:**
|
|
106
|
+
|
|
107
|
+
- **Layout/Structure** - DOM structure, element presence, positioning
|
|
108
|
+
- **User Interactions** - Clicks, keyboard shortcuts, drag/drop
|
|
109
|
+
- **State Management** - State changes, persistence, reactivity
|
|
110
|
+
- **Accessibility** - ARIA labels, keyboard navigation, focus management
|
|
111
|
+
- **Edge Cases** - Error handling, boundary conditions, race conditions
|
|
112
|
+
- **Technical Constraints** - Non-functional requirements from user story (see below)
|
|
113
|
+
|
|
114
|
+
**Each suite should have:**
|
|
115
|
+
|
|
116
|
+
- Clear name describing what it tests
|
|
117
|
+
- Brief description (1-2 sentences)
|
|
118
|
+
- Related tests grouped logically
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
## Coverage Summary Best Practices
|
|
123
|
+
|
|
124
|
+
**Always include:**
|
|
125
|
+
|
|
126
|
+
- Total test count
|
|
127
|
+
- Breakdown by status (passing, skipped, not implemented, failing)
|
|
128
|
+
- Percentages for each category
|
|
129
|
+
- Coverage by feature table
|
|
130
|
+
- Rationale for skipped tests
|
|
131
|
+
|
|
132
|
+
**Example:**
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
**Total**: 20 tests
|
|
136
|
+
**Passing**: 9 tests (45%)
|
|
137
|
+
**Skipped**: 4 tests (20%)
|
|
138
|
+
**Not Implemented**: 7 tests (35%)
|
|
139
|
+
**Failing**: 0 tests
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Skipped Tests Rationale
|
|
145
|
+
|
|
146
|
+
**Always explain why tests are skipped:**
|
|
147
|
+
|
|
148
|
+
**✅ GOOD - Clear reasoning:**
|
|
149
|
+
|
|
150
|
+
- "Conflicts with Phase 2 design decision (AI pane hidden by default)"
|
|
151
|
+
- "Requires complex drag simulation, tested manually"
|
|
152
|
+
- "Blocked by upstream dependency (Issue #42)"
|
|
153
|
+
|
|
154
|
+
**❌ BAD - No explanation:**
|
|
155
|
+
|
|
156
|
+
- "Skipped"
|
|
157
|
+
- "Not needed"
|
|
158
|
+
- "TODO"
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Test Execution Section
|
|
163
|
+
|
|
164
|
+
**Include practical commands:**
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# Run all tests for this feature
|
|
168
|
+
npm run test:e2e -- tests/feature-name.spec.ts
|
|
169
|
+
|
|
170
|
+
# Run specific test
|
|
171
|
+
npm run test:e2e -- tests/feature-name.spec.ts --grep "specific test name"
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## TDD Workflow Integration
|
|
177
|
+
|
|
178
|
+
**Test definitions should be created:**
|
|
179
|
+
|
|
180
|
+
1. **Before implementation** (TDD: write tests first)
|
|
181
|
+
2. **During planning** (alongside user stories)
|
|
182
|
+
3. **After user stories** (tests verify acceptance criteria)
|
|
183
|
+
|
|
184
|
+
**Update test definitions:**
|
|
185
|
+
|
|
186
|
+
- Mark tests ✅ as they pass
|
|
187
|
+
- Add ⏭️ with rationale if skipping
|
|
188
|
+
- Mark 🔴 if tests fail
|
|
189
|
+
- Update "Last Updated" date
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Relationship to User Stories
|
|
194
|
+
|
|
195
|
+
**Test definitions should:**
|
|
196
|
+
|
|
197
|
+
- Map directly to user story acceptance criteria
|
|
198
|
+
- Cover all acceptance criteria from user stories
|
|
199
|
+
- Include additional edge cases and error scenarios
|
|
200
|
+
- Reference test file locations mentioned in user stories
|
|
201
|
+
- **Include tests for Technical Constraints** (non-functional requirements)
|
|
202
|
+
|
|
203
|
+
**Example:**
|
|
204
|
+
|
|
205
|
+
- User Story AC: "AI pane is visible when toggled"
|
|
206
|
+
- Test: "Test 3.1: Cmd+J toggles AI pane visibility ✅"
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Testing Technical Constraints
|
|
211
|
+
|
|
212
|
+
**Purpose:** User stories include a Technical Constraints section with non-functional requirements. These constraints MUST have corresponding tests.
|
|
213
|
+
|
|
214
|
+
**See:** `@.safeword/guides/user-story-guide.md` for constraint categories and examples.
|
|
215
|
+
|
|
216
|
+
### Constraint Categories → Test Types
|
|
217
|
+
|
|
218
|
+
| Constraint Category | Test Type | What to Verify |
|
|
219
|
+
| ------------------- | -------------------------- | --------------------------------------------------- |
|
|
220
|
+
| Performance | Load/timing tests | Response times, throughput, capacity limits |
|
|
221
|
+
| Security | Security tests | Input sanitization, auth checks, rate limiting |
|
|
222
|
+
| Compatibility | Cross-browser/device tests | Browser versions, mobile, accessibility |
|
|
223
|
+
| Data | Compliance tests | Retention, deletion, privacy rules |
|
|
224
|
+
| Dependencies | Integration tests | Required services work, no forbidden packages |
|
|
225
|
+
| Infrastructure | Resource tests | Memory limits, offline behavior, deploy constraints |
|
|
226
|
+
|
|
227
|
+
### Writing Constraint Tests
|
|
228
|
+
|
|
229
|
+
**✅ GOOD - Specific, measurable:**
|
|
230
|
+
|
|
231
|
+
```markdown
|
|
232
|
+
### Test 7.1: API response under load ✅
|
|
233
|
+
|
|
234
|
+
**Status**: ✅ Passing
|
|
235
|
+
**Category**: Performance
|
|
236
|
+
**Constraint**: API response < 200ms at P95
|
|
237
|
+
|
|
238
|
+
**Steps**:
|
|
239
|
+
|
|
240
|
+
1. Spawn 100 concurrent requests to /api/data
|
|
241
|
+
2. Measure response times for all requests
|
|
242
|
+
3. Calculate P95 latency
|
|
243
|
+
|
|
244
|
+
**Expected**:
|
|
245
|
+
|
|
246
|
+
- P95 response time < 200ms
|
|
247
|
+
- No requests timeout
|
|
248
|
+
- No 5xx errors under load
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
**❌ BAD - Vague, untestable:**
|
|
252
|
+
|
|
253
|
+
```markdown
|
|
254
|
+
### Test 7.1: Performance test
|
|
255
|
+
|
|
256
|
+
**Steps**: Check if fast
|
|
257
|
+
**Expected**: Good performance
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### When to Skip Constraint Tests
|
|
261
|
+
|
|
262
|
+
**Document skipped constraint tests with rationale:**
|
|
263
|
+
|
|
264
|
+
- "Performance: Tested in CI pipeline, not in unit tests"
|
|
265
|
+
- "Compatibility: Manual testing on BrowserStack, see QA checklist"
|
|
266
|
+
- "Security: Covered by automated SAST scan (Snyk)"
|
|
267
|
+
|
|
268
|
+
**Never skip without explanation.**
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Example: Good Test Definition
|
|
273
|
+
|
|
274
|
+
```markdown
|
|
275
|
+
### Test 3.1: Cmd+J toggles AI pane visibility ✅
|
|
276
|
+
|
|
277
|
+
**Status**: ✅ Passing
|
|
278
|
+
**Description**: Verifies Cmd+J keyboard shortcut toggles AI pane
|
|
279
|
+
|
|
280
|
+
**Steps**:
|
|
281
|
+
|
|
282
|
+
1. Verify AI pane hidden initially (default state)
|
|
283
|
+
2. Press Cmd+J (Mac) or Ctrl+J (Windows/Linux)
|
|
284
|
+
3. Verify AI pane becomes visible
|
|
285
|
+
4. Press Cmd+J again
|
|
286
|
+
5. Verify AI pane becomes hidden
|
|
287
|
+
|
|
288
|
+
**Expected**:
|
|
289
|
+
|
|
290
|
+
- AI pane starts hidden
|
|
291
|
+
- After first toggle: AI pane visible
|
|
292
|
+
- After second toggle: AI pane hidden
|
|
293
|
+
- Toggle action triggers state change in uiStore
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## Common Mistakes to Avoid
|
|
299
|
+
|
|
300
|
+
❌ **Don't test implementation details:**
|
|
301
|
+
|
|
302
|
+
- Bad: "Verify useState hook updates"
|
|
303
|
+
- Good: "Verify pane becomes visible when toggled"
|
|
304
|
+
|
|
305
|
+
❌ **Don't write vague steps:**
|
|
306
|
+
|
|
307
|
+
- Bad: "Check if it works"
|
|
308
|
+
- Good: "Click button and verify modal appears"
|
|
309
|
+
|
|
310
|
+
❌ **Don't skip rationale for skipped tests:**
|
|
311
|
+
|
|
312
|
+
- Always explain WHY a test is skipped
|
|
313
|
+
|
|
314
|
+
❌ **Don't forget coverage summary:**
|
|
315
|
+
|
|
316
|
+
- Always include totals and percentages
|
|
317
|
+
|
|
318
|
+
❌ **Don't duplicate test descriptions:**
|
|
319
|
+
|
|
320
|
+
- Each test should have a unique, descriptive name
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## LLM Instruction Design
|
|
325
|
+
|
|
326
|
+
**Important:** Test definitions are instructions that LLMs read and follow. Apply best practices for clarity.
|
|
327
|
+
|
|
328
|
+
**See:** `@.safeword/guides/llm-instruction-design.md` for comprehensive framework including:
|
|
329
|
+
|
|
330
|
+
- MECE decision trees (mutually exclusive, collectively exhaustive)
|
|
331
|
+
- Explicit definitions (never assume LLMs know what you mean)
|
|
332
|
+
- Concrete examples over abstract rules
|
|
333
|
+
- Edge cases must be explicit
|
|
334
|
+
- Actionable over vague language
|