@nano-step/skill-manager 5.4.0 → 5.4.2

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/README.md CHANGED
@@ -26,20 +26,20 @@ npx @nano-step/skill-manager install --all
26
26
  | `update [name]` | Update one or all installed skills |
27
27
  | `installed` | Show currently installed skills |
28
28
 
29
- ## Available Skills (17)
29
+ ## Available Skills (15 public + 6 private)
30
+
31
+ ### Public Skills (bundled in npm)
30
32
 
31
33
  | Skill | Description |
32
34
  |-------|-------------|
33
35
  | `blog-workflow` | Generate SEO-optimized blog posts for dev.to, Medium, LinkedIn, Hashnode |
34
36
  | `comprehensive-feature-builder` | Systematic 5-phase workflow for researching, designing, implementing, and testing features |
35
- | `feature-analysis` | Deep code analysis with execution tracing, data transformation audits, and gap analysis |
36
37
  | `graphql-inspector` | GraphQL schema inspection with progressive discovery workflow |
37
38
  | `idea-workflow` | Analyze source code and produce monetization strategy with execution blueprint |
38
39
  | `mermaid-validator` | Validate Mermaid diagram syntax — enforces rules that prevent parse errors |
39
40
  | `nano-brain` | Persistent memory for AI agents — hybrid search across sessions, codebase, and notes |
40
41
  | `pdf` | PDF manipulation toolkit — extract, create, merge, split, OCR, fill forms, watermark |
41
42
  | `reddit-workflow` | Draft Reddit posts optimized for subreddit rules, tone, and spam filters |
42
- | `rri-t-testing` | RRI-T QA methodology — 5-phase testing with 7 dimensions, 5 personas, and release gates |
43
43
  | `rtk` | Token optimizer — wraps CLI commands with rtk to reduce token consumption by 60-90% |
44
44
  | `rtk-setup` | One-time RTK setup + ongoing enforcement across sessions and subagents |
45
45
  | `security-workflow` | OWASP Top 10 security audit with CVE scanning and prioritized hardening plan |
@@ -47,6 +47,17 @@ npx @nano-step/skill-manager install --all
47
47
  | `skill-management` | AI skill routing — isolates tool definitions in subagent context to save 80-95% tokens |
48
48
  | `team-workflow` | Simulate an autonomous software team — architecture, execution plan, QA strategy |
49
49
  | `ui-ux-pro-max` | UI/UX design intelligence with searchable database of styles, palettes, fonts, and guidelines |
50
+
51
+ ### Private Skills (requires `login`)
52
+
53
+ | Skill | Description |
54
+ |-------|-------------|
55
+ | `e2e-test-generator` | E2E test generation from PRD using Playwright MCP |
56
+ | `feature-analysis` | Deep code analysis with execution tracing and gap analysis |
57
+ | `mcp-management` | MCP tool routing and execution with token-saving isolation |
58
+ | `pr-code-reviewer` | Comprehensive PR code review with 4 parallel subagents |
59
+ | `rri-t-testing` | RRI-T QA methodology — 5-phase testing with 7 dimensions and release gates |
60
+ | `database-inspector` | Database schema inspection for MySQL and PostgreSQL with progressive discovery |
50
61
  ## What Gets Installed
51
62
 
52
63
  When you install a skill, the manager:
package/dist/utils.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export declare const MANAGER_VERSION = "5.4.0";
1
+ export declare const MANAGER_VERSION = "5.4.2";
2
2
  export interface SkillManifest {
3
3
  name: string;
4
4
  version: string;
package/dist/utils.js CHANGED
@@ -13,7 +13,7 @@ exports.writeText = writeText;
13
13
  const path_1 = __importDefault(require("path"));
14
14
  const os_1 = __importDefault(require("os"));
15
15
  const fs_extra_1 = __importDefault(require("fs-extra"));
16
- exports.MANAGER_VERSION = "5.4.0";
16
+ exports.MANAGER_VERSION = "5.4.2";
17
17
  async function detectOpenCodePaths() {
18
18
  const homeConfig = path_1.default.join(os_1.default.homedir(), ".config", "opencode");
19
19
  const cwd = process.cwd();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nano-step/skill-manager",
3
- "version": "5.4.0",
3
+ "version": "5.4.2",
4
4
  "description": "CLI tool that installs and manages AI agent skills, MCP tool routing, and workflow configurations.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -1,290 +0,0 @@
1
- ---
2
- name: feature-analysis
3
- description: "Deep code analysis of any feature or service before writing docs, diagrams, or making changes. Enforces read-everything-first discipline. Traces exact execution paths, data transformations, guard clauses, bugs, and gaps between existing docs and actual code. Produces a validated Mermaid diagram and structured analysis output. Language and framework agnostic."
4
- compatibility: "OpenCode"
5
- metadata:
6
- version: "2.0.0"
7
- tools:
8
- required:
9
- - Read (every file in the feature)
10
- - Bash (find all files, run mermaid validator)
11
- uses:
12
- - mermaid-validator skill (validate any diagram produced)
13
- triggers:
14
- - "analyze [feature]"
15
- - "how does X work"
16
- - "trace the flow of"
17
- - "understand X"
18
- - "what does X do"
19
- - "deep dive into"
20
- - "working on X - understand it first"
21
- - "update docs/brain for"
22
- ---
23
-
24
- # Feature Analysis Skill
25
-
26
- A disciplined protocol for deeply analyzing any feature in any codebase before producing docs, diagrams, or making changes. Framework-agnostic. Language-agnostic.
27
-
28
- ---
29
-
30
- ## The Core Rule
31
-
32
- **READ EVERYTHING. PRODUCE NOTHING. THEN SYNTHESIZE.**
33
-
34
- Do not write a single diagram node, doc line, or description until every file in the feature has been read. Every time you produce output before reading all files, you will miss something.
35
-
36
- ---
37
-
38
- ## Phase 1: Discovery — Find Every File
39
-
40
- Before reading anything, map the full file set.
41
-
42
- ```bash
43
- # Find all source files for the feature
44
- find <feature-dir> -type f | sort
45
-
46
- # Check imports to catch shared utilities, decorators, helpers
47
- grep -r "import\|require" <feature-dir> | grep -v node_modules | sort -u
48
- ```
49
-
50
- **Read in dependency order (bottom-up — foundations first):**
51
-
52
- 1. **Entry point / bootstrap** — port, env vars, startup config
53
- 2. **Schema / model files** — DB schema, columns, nullable, indexes, types
54
- 3. **Utility / helper files** — every function, every transformation, every constant
55
- 4. **Decorator / middleware files** — wrapping logic, side effects, return value handling
56
- 5. **Infrastructure services** — cache, lock, queue, external connections
57
- 6. **Core business logic** — the main service/handler files
58
- 7. **External / fetch services** — HTTP calls, filters applied, error handling
59
- 8. **Entry controllers / routers / handlers** — HTTP method, route, params, return
60
- 9. **Wiring files** — module/DI config, middleware registration
61
-
62
- **Do not skip any file. Do not skim.**
63
-
64
- ---
65
-
66
- ## Phase 2: Per-File Checklist
67
-
68
- For each file, answer these questions before moving to the next.
69
-
70
- ### Entry point / bootstrap
71
- - [ ] What port or address? (default? env override?)
72
- - [ ] Any global middleware, pipes, interceptors, or lifecycle hooks?
73
-
74
- ### Schema / model files
75
- - [ ] Table/collection name
76
- - [ ] Every field: type, nullable, default, constraints, indexes
77
- - [ ] Relations / references to other entities
78
-
79
- ### Utility / helper files
80
- - [ ] Every exported function — what does it do, step by step?
81
- - [ ] For transformations: what inputs? what outputs? what edge cases handled?
82
- - [ ] Where is this function called? (grep for usages)
83
- - [ ] How many times is it called within a single method? (once per batch? once per item?)
84
-
85
- ### Decorator / middleware files
86
- - [ ] What does it wrap?
87
- - [ ] What side effects before / after the original method?
88
- - [ ] **Does it `return` the result of the original method?** (missing `return` = silent discard bug)
89
- - [ ] Does it use try/finally? What runs in finally?
90
- - [ ] What happens on the early-exit path?
91
-
92
- ### Core business logic files
93
- - [ ] Every method: signature, return type
94
- - [ ] For each method: trace every line — no summarizing
95
- - [ ] Accumulator variables — where initialized, where incremented, where returned
96
- - [ ] Loop structure: sequential or parallel?
97
- - [ ] Every external call: what service/module, what args, what returned
98
- - [ ] Guard clauses: every early return / continue / throw
99
- - [ ] Every branch in conditionals
100
-
101
- ### External / fetch service files
102
- - [ ] Exact URLs or endpoints (hardcoded or env?)
103
- - [ ] Filters applied to response data (which calls filter, which don't?)
104
- - [ ] Error handling on external calls
105
-
106
- ### Entry controllers / routers / handlers
107
- - [ ] HTTP method (GET vs POST — don't assume)
108
- - [ ] Route path
109
- - [ ] What core method is called?
110
- - [ ] What is returned?
111
-
112
- ### Wiring / module files
113
- - [ ] What is imported / registered?
114
- - [ ] What is exported / exposed?
115
-
116
- ---
117
-
118
- ## Phase 3: Execution Trace
119
-
120
- After reading all files, produce a numbered step-by-step trace of the full execution path. This is not prose — it is a precise trace.
121
-
122
- **Format:**
123
- ```
124
- 1. [HTTP METHOD] /route → HandlerName.methodName()
125
- 2. HandlerName.methodName() → ServiceName.methodName()
126
- 3. @DecoratorName: step A (e.g. acquire lock, check cache)
127
- 4. → if condition X: early return [what is returned / not returned]
128
- 5. ServiceName.methodName():
129
- 6. step 1: call externalService.fetchAll() → parallel([fetchA(), fetchB()])
130
- 7. fetchA(): GET https://... → returns all items (no filter)
131
- 8. fetchB(): GET https://... → filter(x => x.field !== null) → returns filtered
132
- 9. step 2: parallel([processItems(a, 'typeA'), processItems(b, 'typeB')])
133
- 10. processItems(items, type):
134
- 11. init: totalUpdated = 0, totalInserted = 0
135
- 12. for loop (sequential): i = 0 to items.length, step batchSize
136
- 13. batch = items.slice(i, i + batchSize)
137
- 14. { updated, inserted } = await processBatch(batch)
138
- 15. totalUpdated += updated; totalInserted += inserted
139
- 16. return { total: items.length, updated: totalUpdated, inserted: totalInserted }
140
- 17. processBatch(batch):
141
- 18. guard: if batch.length === 0 → return { updated: 0, inserted: 0 }
142
- 19. step 1: names = batch.map(item => transform(item.field)) ← called ONCE per batch
143
- 20. step 2: existing = repo.find(WHERE field IN names)
144
- 21. step 3: map = existing.reduce(...)
145
- 22. step 4: for each item in batch:
146
- 23. value = transform(item.field) ← called AGAIN per item
147
- 24. ...decision tree...
148
- 25. repo.save(itemsToSave)
149
- 26. return { updated, inserted }
150
- 27. @DecoratorName finally: releaseLock()
151
- 28. BUG: decorator does not return result → caller receives undefined
152
- ```
153
-
154
- **Key things to call out in the trace:**
155
- - When a utility function is called more than once (note the count and context)
156
- - Every accumulator variable (where init, where increment, where return)
157
- - Every guard clause / early exit
158
- - Sequential vs parallel (for loop vs Promise.all / asyncio.gather / goroutines)
159
- - Any discarded return values
160
-
161
- ---
162
-
163
- ## Phase 4: Data Transformations Audit
164
-
165
- For every utility/transformation function used:
166
-
167
- | Function | What it does (step by step) | Called where | Called how many times |
168
- |----------|----------------------------|--------------|----------------------|
169
- | `transformFn(x)` | 1. step A 2. step B 3. step C | methodName | TWICE: once in step N (batch), once per item in loop |
170
-
171
- ---
172
-
173
- ## Phase 5: Gap Analysis — Docs vs Code
174
-
175
- Compare existing docs/brain files against what the code actually does:
176
-
177
- | Claim in docs | What code actually does | Verdict |
178
- |---------------|------------------------|---------|
179
- | "POST /endpoint" | `@Get()` in controller | ❌ Wrong |
180
- | "Port 3000" | `process.env.PORT \|\| 4001` in entrypoint | ❌ Wrong |
181
- | "function converts X" | Also does Y (undocumented) | ⚠️ Incomplete |
182
- | "returns JSON result" | Decorator discards return value | ❌ Bug |
183
-
184
- ---
185
-
186
- ## Phase 6: Produce Outputs
187
-
188
- Only now, after phases 1–5 are complete, produce:
189
-
190
- ### 6a. Structured Analysis Document
191
-
192
- ```markdown
193
- ## Feature Analysis: [Feature Name]
194
- Repo: [repo] | Date: [date]
195
-
196
- ### Files Read
197
- - `path/to/controller.ts` — entry point, GET /endpoint, calls ServiceA.run()
198
- - `path/to/service.ts` — core logic, orchestrates fetch + batch loop
199
- - [... every file ...]
200
-
201
- ### Execution Trace
202
- [numbered trace from Phase 3]
203
-
204
- ### Data Transformations
205
- [table from Phase 4]
206
-
207
- ### Guard Clauses & Edge Cases
208
- - processBatch: empty batch guard → returns {0,0} immediately
209
- - fetchItems: filters items where field === null
210
- - LockManager: if lock not acquired → returns void immediately (no error thrown)
211
-
212
- ### Bugs / Issues Found
213
- - path/to/decorator.ts line N: `await originalMethod.apply(this, args)` missing `return`
214
- → result is discarded, caller always receives undefined
215
- - [any others]
216
-
217
- ### Gaps: Docs vs Code
218
- [table from Phase 5]
219
-
220
- ### Files to Update
221
- - [ ] `.agents/_repos/[repo].md` — update port, endpoint method, transformation description
222
- - [ ] `.agents/_domains/[domain].md` — if architecture changed
223
- ```
224
-
225
- ### 6b. Mermaid Diagram
226
-
227
- Write the diagram. Then **immediately run the validator before doing anything else.**
228
-
229
- If you have the mermaid-validator skill:
230
- ```bash
231
- node /path/to/project/scripts/validate-mermaid.mjs [file.md]
232
- ```
233
-
234
- Otherwise validate manually — common syntax errors:
235
- - Labels with `()` must be wrapped in `"double quotes"`: `A["method()"]`
236
- - No `\n` in node labels — use `<br/>` or shorten
237
- - No HTML entities (`&amp;`, `&gt;`) in labels — use literal characters
238
- - `end` is a reserved word in Mermaid — use `END` or `done` as node IDs
239
-
240
- If errors → fix → re-run. Do not proceed until clean.
241
-
242
- **Diagram must include:**
243
- - Every step from the execution trace
244
- - Data transformation nodes (show what the function does, not just its name)
245
- - Guard clauses as decision nodes
246
- - Parallel vs sequential clearly distinguished
247
- - Bugs annotated inline (e.g. "BUG: result discarded")
248
-
249
- ### 6c. Doc / Brain File Updates
250
-
251
- Update relevant docs with:
252
- - Corrected facts (port, endpoint method, etc.)
253
- - The validated Mermaid diagram
254
- - Data transformation table
255
- - Known bugs section
256
-
257
- ---
258
-
259
- ## Anti-Patterns (What This Skill Prevents)
260
-
261
- | Anti-pattern | What gets missed | Rule violated |
262
- |---|---|---|
263
- | Drew diagram before reading utility files | Transformation called twice — not shown | READ EVERYTHING FIRST |
264
- | Trusted existing docs for endpoint method | GET vs POST wrong in docs | GAP ANALYSIS required |
265
- | Summarized service method instead of tracing | Guard clause (empty batch) missed | TRACE NOT SUMMARIZE |
266
- | Trusted existing docs for port/config | Wrong values | Verify entry point |
267
- | Read decorator without checking return | Silent result discard bug | RETURN VALUE AUDIT |
268
- | Merged H1/H2 paths into shared loop node | Sequential vs parallel distinction lost | TRACE LOOP STRUCTURE |
269
- | Assumed filter applies to all fetches | One fetch had no filter — skipped items | READ EVERY FETCH FILE |
270
-
271
- ---
272
-
273
- ## Quick Reference Checklist
274
-
275
- Before producing any output, verify:
276
-
277
- - [ ] Entry point read — port/address confirmed
278
- - [ ] All schema/model files read — every field noted
279
- - [ ] All utility files read — every transformation step documented
280
- - [ ] All decorator/middleware files read — return value audited
281
- - [ ] All core service files read — every method traced line by line
282
- - [ ] All fetch/external services read — filters noted (which have filters, which don't)
283
- - [ ] All controller/router/handler files read — HTTP method confirmed (not assumed)
284
- - [ ] All wiring/module files read — dependency graph understood
285
- - [ ] Utility functions: call count per method noted
286
- - [ ] All guard clauses documented
287
- - [ ] Accumulator variables traced (init → increment → return)
288
- - [ ] Loop structure confirmed (sequential vs parallel)
289
- - [ ] Existing docs compared against code (gap analysis done)
290
- - [ ] Mermaid diagram validated before saving
@@ -1,15 +0,0 @@
1
- {
2
- "name": "feature-analysis",
3
- "version": "2.0.0",
4
- "description": "Deep code analysis of any feature or service before writing docs, diagrams, or making changes. Enforces read-everything-first discipline with execution tracing, data transformation audits, and gap analysis.",
5
- "compatibility": "OpenCode",
6
- "agent": null,
7
- "commands": [],
8
- "tags": [
9
- "analysis",
10
- "code-review",
11
- "documentation",
12
- "mermaid",
13
- "tracing"
14
- ]
15
- }
@@ -1,76 +0,0 @@
1
- ---
2
- name: rri-t-testing
3
- description: RRI-T QA methodology skill. Execute 5-phase testing: PREPARE, DISCOVER, STRUCTURE, EXECUTE, ANALYZE. Use before release, creating test cases, or QA review.
4
- ---
5
-
6
- # RRI-T Testing Skill
7
-
8
- Execute comprehensive QA testing using Reverse Requirements Interview - Testing methodology.
9
-
10
- ## When to Use
11
-
12
- - Testing any feature before release
13
- - Creating test cases for new features
14
- - Performing thorough QA review
15
- - Running stress tests and edge case analysis
16
-
17
- ## Input
18
-
19
- | Param | Req | Description |
20
- |-------|-----|-------------|
21
- | feature | Yes | Feature name in kebab-case |
22
- | phase | No | `prepare`, `discover`, `structure`, `execute`, `analyze` |
23
- | dimensions | No | `ui-ux,api,performance,security,data,infra,edge-cases` |
24
-
25
- ## 5 Phases
26
-
27
- 1. **PREPARE** — Read specs, setup output dir
28
- 2. **DISCOVER** — Interview 5 personas for test scenarios
29
- 3. **STRUCTURE** — Format as Q-A-R-P-T test cases
30
- 4. **EXECUTE** — Run tests, capture screenshots
31
- 5. **ANALYZE** — Calculate coverage, apply release gates
32
-
33
- ## Output
34
-
35
- ```
36
- /ai/test-case/rri-t/{feature-name}/
37
- ├── 01-prepare.md
38
- ├── 02-discover.md
39
- ├── 03-structure.md
40
- ├── 04-execute.md
41
- ├── 05-analyze.md
42
- └── summary.md
43
- ```
44
-
45
- ## Templates
46
-
47
- Use templates bundled in `assets/` directory of this skill:
48
- - `rri-t-persona-interview.md` — Persona interviews
49
- - `rri-t-test-case.md` — Q-A-R-P-T format
50
- - `rri-t-coverage-dashboard.md` — 7-dimension tracking
51
- - `rri-t-stress-matrix.md` — 8-axis stress testing
52
-
53
- ## 7 Dimensions
54
-
55
- UI/UX | API | Performance | Security | Data Integrity | Infrastructure | Edge Cases
56
-
57
- ## 5 Personas
58
-
59
- End User | Business Analyst | QA Destroyer | DevOps Tester | Security Auditor
60
-
61
- ## Release Gates
62
-
63
- | GO | NO-GO |
64
- |----|-------|
65
- | All 7 dims >= 70% | Any dim < 50% |
66
- | 5/7 >= 85% | >2 P0 FAILs |
67
- | Zero P0 FAIL | Critical MISSING |
68
-
69
- ## Guardrails
70
-
71
- 1. Test all 7 dimensions
72
- 2. Use all 5 personas
73
- 3. Document everything
74
- 4. PAINFUL is valid (not failure)
75
- 5. Follow release gates
76
- 6. Test Vietnamese locale
@@ -1,101 +0,0 @@
1
- # RRI-T Coverage Dashboard — {feature_name}
2
-
3
- Feature: {feature_name}
4
- Date: {date}
5
- Release Gate Status: {release_gate_status}
6
- Release Version: {release_version}
7
- Owner: {owner}
8
- Prepared By: {prepared_by}
9
-
10
- ## Release Gate Criteria
11
-
12
- | Rule | Criteria | Status |
13
- | --- | --- | --- |
14
- | RG-1 | All 7 dimensions >= 70% coverage | {rg1_status} |
15
- | RG-2 | At least 5/7 dimensions >= 85% coverage | {rg2_status} |
16
- | RG-3 | Zero P0 items in FAIL state | {rg3_status} |
17
-
18
- ## Dimension Coverage
19
-
20
- | Dimension | Total | PASS | FAIL | PAINFUL | MISSING | Coverage % | Gate |
21
- | --- | --- | --- | --- | --- | --- | --- | --- |
22
- | D1: UI/UX | {d1_total} | {d1_pass} | {d1_fail} | {d1_painful} | {d1_missing} | {d1_coverage} | {d1_gate} |
23
- | D2: API | {d2_total} | {d2_pass} | {d2_fail} | {d2_painful} | {d2_missing} | {d2_coverage} | {d2_gate} |
24
- | D3: Performance | {d3_total} | {d3_pass} | {d3_fail} | {d3_painful} | {d3_missing} | {d3_coverage} | {d3_gate} |
25
- | D4: Security | {d4_total} | {d4_pass} | {d4_fail} | {d4_painful} | {d4_missing} | {d4_coverage} | {d4_gate} |
26
- | D5: Data Integrity | {d5_total} | {d5_pass} | {d5_fail} | {d5_painful} | {d5_missing} | {d5_coverage} | {d5_gate} |
27
- | D6: Infrastructure | {d6_total} | {d6_pass} | {d6_fail} | {d6_painful} | {d6_missing} | {d6_coverage} | {d6_gate} |
28
- | D7: Edge Cases | {d7_total} | {d7_pass} | {d7_fail} | {d7_painful} | {d7_missing} | {d7_coverage} | {d7_gate} |
29
-
30
- Legend: ✅ PASS | ❌ FAIL | ⚠️ PAINFUL | ☐ MISSING
31
-
32
- ## Priority Breakdown
33
-
34
- | Priority | Total | PASS | FAIL | PAINFUL | MISSING | Coverage % | Gate |
35
- | --- | --- | --- | --- | --- | --- | --- | --- |
36
- | P0 | {p0_total} | {p0_pass} | {p0_fail} | {p0_painful} | {p0_missing} | {p0_coverage} | {p0_gate} |
37
- | P1 | {p1_total} | {p1_pass} | {p1_fail} | {p1_painful} | {p1_missing} | {p1_coverage} | {p1_gate} |
38
- | P2 | {p2_total} | {p2_pass} | {p2_fail} | {p2_painful} | {p2_missing} | {p2_coverage} | {p2_gate} |
39
- | P3 | {p3_total} | {p3_pass} | {p3_fail} | {p3_painful} | {p3_missing} | {p3_coverage} | {p3_gate} |
40
-
41
- ## Summary Metrics
42
-
43
- - Total Test Cases: {total_tc}
44
- - Overall Coverage %: {overall_coverage}
45
- - Dimensions Passing Gate: {dimensions_passing_gate}
46
- - P0 FAIL Count: {p0_fail_count}
47
- - P0 PAINFUL Count: {p0_painful_count}
48
- - MISSING Count: {missing_count}
49
- - Latest Update: {latest_update}
50
- - Notes: {summary_notes}
51
- - Risks: {summary_risks}
52
-
53
- ## FAIL Items
54
-
55
- | TC ID | Priority | Dimension | Description | Assigned To |
56
- | --- | --- | --- | --- | --- |
57
- | {fail_tc_id_1} | {fail_priority_1} | {fail_dimension_1} | {fail_description_1} | {fail_assigned_to_1} |
58
- | {fail_tc_id_2} | {fail_priority_2} | {fail_dimension_2} | {fail_description_2} | {fail_assigned_to_2} |
59
- | {fail_tc_id_3} | {fail_priority_3} | {fail_dimension_3} | {fail_description_3} | {fail_assigned_to_3} |
60
- | {fail_tc_id_4} | {fail_priority_4} | {fail_dimension_4} | {fail_description_4} | {fail_assigned_to_4} |
61
- | {fail_tc_id_5} | {fail_priority_5} | {fail_dimension_5} | {fail_description_5} | {fail_assigned_to_5} |
62
-
63
- ## PAINFUL Items
64
-
65
- | TC ID | Priority | Dimension | Description | UX Impact |
66
- | --- | --- | --- | --- | --- |
67
- | {painful_tc_id_1} | {painful_priority_1} | {painful_dimension_1} | {painful_description_1} | {painful_ux_impact_1} |
68
- | {painful_tc_id_2} | {painful_priority_2} | {painful_dimension_2} | {painful_description_2} | {painful_ux_impact_2} |
69
- | {painful_tc_id_3} | {painful_priority_3} | {painful_dimension_3} | {painful_description_3} | {painful_ux_impact_3} |
70
- | {painful_tc_id_4} | {painful_priority_4} | {painful_dimension_4} | {painful_description_4} | {painful_ux_impact_4} |
71
- | {painful_tc_id_5} | {painful_priority_5} | {painful_dimension_5} | {painful_description_5} | {painful_ux_impact_5} |
72
-
73
- ## MISSING Items
74
-
75
- | TC ID | Priority | Dimension | Description | User Need |
76
- | --- | --- | --- | --- | --- |
77
- | {missing_tc_id_1} | {missing_priority_1} | {missing_dimension_1} | {missing_description_1} | {missing_user_need_1} |
78
- | {missing_tc_id_2} | {missing_priority_2} | {missing_dimension_2} | {missing_description_2} | {missing_user_need_2} |
79
- | {missing_tc_id_3} | {missing_priority_3} | {missing_dimension_3} | {missing_description_3} | {missing_user_need_3} |
80
- | {missing_tc_id_4} | {missing_priority_4} | {missing_dimension_4} | {missing_description_4} | {missing_user_need_4} |
81
- | {missing_tc_id_5} | {missing_priority_5} | {missing_dimension_5} | {missing_description_5} | {missing_user_need_5} |
82
-
83
- ## Regression Test List
84
-
85
- | Test ID | Title | Dimension | Priority | Status |
86
- | --- | --- | --- | --- | --- |
87
- | {regression_id_1} | {regression_title_1} | {regression_dimension_1} | {regression_priority_1} | {regression_status_1} |
88
- | {regression_id_2} | {regression_title_2} | {regression_dimension_2} | {regression_priority_2} | {regression_status_2} |
89
- | {regression_id_3} | {regression_title_3} | {regression_dimension_3} | {regression_priority_3} | {regression_status_3} |
90
- | {regression_id_4} | {regression_title_4} | {regression_dimension_4} | {regression_priority_4} | {regression_status_4} |
91
- | {regression_id_5} | {regression_title_5} | {regression_dimension_5} | {regression_priority_5} | {regression_status_5} |
92
-
93
- ## Sign-off
94
-
95
- | Role | Name | Decision | Notes |
96
- | --- | --- | --- | --- |
97
- | QA Lead | {qa_lead_name} | {qa_lead_decision} | {qa_lead_notes} |
98
- | Dev Lead | {dev_lead_name} | {dev_lead_decision} | {dev_lead_notes} |
99
- | Product | {product_name} | {product_decision} | {product_notes} |
100
-
101
- Decision Legend: {approve_label}/{reject_label}
@@ -1,226 +0,0 @@
1
- # RRI-T Persona Interview — {Feature Name}
2
-
3
- **Feature:** {feature-name}
4
- **Date:** {YYYY-MM-DD}
5
- **Interviewer:** {agent/person}
6
-
7
- ## Interview Summary
8
- | Persona | Questions Generated | Key Concerns |
9
- |---------|-------------------|--------------|
10
- | End User | 0/25 | |
11
- | Business Analyst | 0/25 | |
12
- | QA Destroyer | 0/25 | |
13
- | DevOps Tester | 0/25 | |
14
- | Security Auditor | 0/25 | |
15
- | **Total** | **0/125** | |
16
-
17
- ---
18
-
19
- ## Persona 1: End User (Người dùng cuối)
20
-
21
- ### Context
22
- As a household member using {feature-name} daily to manage my family's shared resources, I need the feature to work reliably across different devices, network conditions, and usage patterns. I care about speed, clarity, and not losing my work.
23
-
24
- ### Questions
25
- 1. What happens when I add an inventory item while my phone has weak 3G signal?
26
- 2. What happens when I start editing a shopping list on mobile, then switch to desktop mid-task?
27
- 3. What happens when I search for "nguyen" but the item name is "Nguyễn Văn A"?
28
- 4. What happens when I accidentally navigate away from a half-filled form?
29
- 5. What happens when I try to delete an item that another household member is currently editing?
30
- 6. What happens when I upload a photo of a receipt and the file is 10MB?
31
- 7. What happens when I filter 500+ inventory items by expiration date on a mid-range phone?
32
- 8. What happens when I receive a phone call while recording a voice note for a meal plan?
33
- 9. What happens when the app shows "1,000,000đ" instead of "1.000.000đ" for Vietnamese currency?
34
- 10. What happens when I'm offline for 2 days and then reconnect with 50 pending changes?
35
- 11.
36
- 12.
37
- 13.
38
- 14.
39
- 15.
40
- 16.
41
- 17.
42
- 18.
43
- 19.
44
- 20.
45
- 21.
46
- 22.
47
- 23.
48
- 24.
49
- 25.
50
-
51
- ### Key Concerns
52
- - {list concerns discovered}
53
-
54
- ---
55
-
56
- ## Persona 2: Business Analyst (Phân tích nghiệp vụ)
57
-
58
- ### Context
59
- As someone responsible for ensuring business rules are correctly implemented, I need to verify that household permissions, data ownership, financial calculations, and multi-household scenarios work as specified. I care about data consistency and rule enforcement.
60
-
61
- ### Questions
62
- 1. What happens when a household member with "viewer" role tries to delete an inventory item?
63
- 2. What happens when a user belongs to 3 households and switches between them rapidly?
64
- 3. What happens when two members simultaneously mark the same shopping list item as "purchased"?
65
- 4. What happens when a household admin removes a member who has pending edits?
66
- 5. What happens when the total expense calculation includes items in different currencies (VND and USD)?
67
- 6. What happens when a recurring meal plan conflicts with a one-time event on the same date?
68
- 7. What happens when a user tries to share an inventory item with a household they don't belong to?
69
- 8. What happens when the system calculates "items expiring in 3 days" across different timezones?
70
- 9. What happens when a household reaches the maximum allowed inventory items (if there's a limit)?
71
- 10. What happens when a deleted household still has active shopping lists in other members' offline caches?
72
- 11.
73
- 12.
74
- 13.
75
- 14.
76
- 15.
77
- 16.
78
- 17.
79
- 18.
80
- 19.
81
- 20.
82
- 21.
83
- 22.
84
- 23.
85
- 24.
86
- 25.
87
-
88
- ### Key Concerns
89
- - {list concerns discovered}
90
-
91
- ---
92
-
93
- ## Persona 3: QA Destroyer (Phá hoại viên QA)
94
-
95
- ### Context
96
- As someone whose job is to break things, I need to find every edge case, race condition, and unexpected input that could crash the system or corrupt data. I care about boundary conditions, malformed inputs, and timing attacks.
97
-
98
- ### Questions
99
- 1. What happens when I paste 50,000 characters into the "item name" field?
100
- 2. What happens when I rapidly click "save" 20 times in 1 second?
101
- 3. What happens when I set my device date to 2099 and create an inventory item?
102
- 4. What happens when I upload a file named `"; DROP TABLE inventory; --"` as an item photo?
103
- 5. What happens when I create an item with expiration date "yesterday" and quantity "-5"?
104
- 6. What happens when I open the app in 10 browser tabs and edit the same item in all of them?
105
- 7. What happens when I force-kill the app during a GraphQL mutation?
106
- 8. What happens when I inject `<script>alert('xss')</script>` into a meal plan description?
107
- 9. What happens when I create a circular dependency (Item A requires Item B, Item B requires Item A)?
108
- 10. What happens when I change my device timezone mid-session and create a timestamped event?
109
- 11.
110
- 12.
111
- 13.
112
- 14.
113
- 15.
114
- 16.
115
- 17.
116
- 18.
117
- 19.
118
- 20.
119
- 21.
120
- 22.
121
- 23.
122
- 24.
123
- 25.
124
-
125
- ### Key Concerns
126
- - {list concerns discovered}
127
-
128
- ---
129
-
130
- ## Persona 4: DevOps Tester (Kiểm thử hạ tầng)
131
-
132
- ### Context
133
- As someone responsible for deployment, monitoring, and infrastructure reliability, I need to verify that the feature works under load, handles server restarts gracefully, and doesn't leak resources. I care about scalability, observability, and recovery.
134
-
135
- ### Questions
136
- 1. What happens when the GraphQL server restarts while a user is mid-sync?
137
- 2. What happens when 100 users simultaneously bulk-import 500 inventory items each?
138
- 3. What happens when the database connection pool is exhausted during peak usage?
139
- 4. What happens when the CDN serving item photos goes down?
140
- 5. What happens when a GraphQL query takes longer than the 30-second timeout?
141
- 6. What happens when the Redis cache is cleared while users have active sessions?
142
- 7. What happens when a deployment rolls out a new schema version while old clients are still connected?
143
- 8. What happens when disk space runs out during a photo upload?
144
- 9. What happens when the monitoring system detects 500 errors but the app still appears functional?
145
- 10. What happens when a user's offline queue grows to 1000+ pending mutations?
146
- 11.
147
- 12.
148
- 13.
149
- 14.
150
- 15.
151
- 16.
152
- 17.
153
- 18.
154
- 19.
155
- 20.
156
- 21.
157
- 22.
158
- 23.
159
- 24.
160
- 25.
161
-
162
- ### Key Concerns
163
- - {list concerns discovered}
164
-
165
- ---
166
-
167
- ## Persona 5: Security Auditor (Kiểm toán bảo mật)
168
-
169
- ### Context
170
- As someone responsible for security compliance, I need to verify that authentication, authorization, data exposure, and audit trails are properly implemented. I care about access control, data leakage, and attack surface.
171
-
172
- ### Questions
173
- 1. What happens when a user's JWT token expires mid-session?
174
- 2. What happens when a user tries to access another household's data by guessing the household ID?
175
- 3. What happens when a removed household member still has cached data on their device?
176
- 4. What happens when someone intercepts the GraphQL request and replays it with modified variables?
177
- 5. What happens when a user tries to upload a malicious file disguised as an image?
178
- 6. What happens when the audit log shows who deleted an item, but the user claims they didn't?
179
- 7. What happens when a user shares their session token with someone outside the household?
180
- 8. What happens when someone uses SQL injection in a search query (even though it's GraphQL)?
181
- 9. What happens when a user's password is compromised and they don't realize it for 3 days?
182
- 10. What happens when the system logs sensitive data (like financial amounts) in plain text?
183
- 11.
184
- 12.
185
- 13.
186
- 14.
187
- 15.
188
- 16.
189
- 17.
190
- 18.
191
- 19.
192
- 20.
193
- 21.
194
- 22.
195
- 23.
196
- 24.
197
- 25.
198
-
199
- ### Key Concerns
200
- - {list concerns discovered}
201
-
202
- ---
203
-
204
- ## Raw Test Ideas (Consolidated)
205
- | # | Idea | Source Persona | Potential Dimension | Priority Estimate |
206
- |---|------|---------------|--------------------|--------------------|
207
- | 1 | | | | |
208
- | 2 | | | | |
209
- | 3 | | | | |
210
- | 4 | | | | |
211
- | 5 | | | | |
212
- | 6 | | | | |
213
- | 7 | | | | |
214
- | 8 | | | | |
215
- | 9 | | | | |
216
- | 10 | | | | |
217
- | 11 | | | | |
218
- | 12 | | | | |
219
- | 13 | | | | |
220
- | 14 | | | | |
221
- | 15 | | | | |
222
- | 16 | | | | |
223
- | 17 | | | | |
224
- | 18 | | | | |
225
- | 19 | | | | |
226
- | 20 | | | | |
@@ -1,100 +0,0 @@
1
- # RRI-T Stress Matrix Template
2
-
3
- ## Feature
4
- - Name: <feature-name>
5
- - Owner: <owner>
6
- - Date: <yyyy-mm-dd>
7
- - Build/Release: <build-id>
8
- - Environment: <dev/staging/prod>
9
-
10
- ## Summary
11
- This template covers RRI-T 8-axis stress testing for a household management app
12
- (inventory, meal planning, shopping lists, finances).
13
-
14
- ## Stress Axes Summary
15
- | Axis | Name | Focus | Notes |
16
- | --- | --- | --- | --- |
17
- | 1 | TIME | Deadlines, bulk ops, timeouts | Burst actions, long-running jobs |
18
- | 2 | DATA | 1000+ rows, search/filter speed | Large inventory, long history |
19
- | 3 | ERROR | Undo/redo, auto-save recovery, messages | Resilience, recoverability |
20
- | 4 | COLLAB | Concurrent editing, conflicts, multi-user | Household members overlap |
21
- | 5 | EMERGENCY | Interruptions, crash recovery | Browser/device failures |
22
- | 6 | SECURITY | Access revocation, audit logs, session expiry | Role changes, expiring auth |
23
- | 7 | INFRA | Server crash, RTO<15m, RPO<5m, offline | Service resilience |
24
- | 8 | LOCALE | Vietnamese diacritics, VND, GMT+7, overflow | Local UX correctness |
25
-
26
- ## Axis Combination Matrix (Test Where X)
27
- | Axis | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
28
- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
29
- | 1 TIME | - | X | X | X | X | X | X | X |
30
- | 2 DATA | X | - | X | X | | X | X | X |
31
- | 3 ERROR | X | X | - | X | X | | X | X |
32
- | 4 COLLAB | X | X | X | - | | X | | X |
33
- | 5 EMERGENCY | X | | X | | - | X | X | |
34
- | 6 SECURITY | X | X | | X | X | - | X | X |
35
- | 7 INFRA | X | X | X | | X | X | - | X |
36
- | 8 LOCALE | X | X | X | X | | X | X | - |
37
-
38
- ## Stress Scenarios
39
-
40
- ### Axis 1: TIME
41
- | # | Scenario | Steps | Expected | Priority |
42
- | --- | --- | --- | --- | --- |
43
- | S-TIME-001 | Bulk add 500 pantry items before dinner | Start timer 2 min, import CSV of pantry items | Import completes, progress visible, no timeout | P1 |
44
- | S-TIME-002 | Rapid meal plan edits during 10-min window | Update 10 meals in 60s, save each | Saves succeed, no stale data, UI responsive | P1 |
45
- | S-TIME-003 | Shopping list sync under poor network | Add 30 items quickly, toggle offline/online | Sync resolves within 60s, no duplicates | P2 |
46
- | S-TIME-004 | Finance entry auto-save timeout | Create expense, wait 45s idle, resume edit | Auto-save persists, no data loss | P2 |
47
-
48
- ### Axis 2: DATA
49
- | # | Scenario | Steps | Expected | Priority |
50
- | S-DATA-001 | Inventory list 1000+ items | Load inventory with 1200 items | Scroll, search, filter remain under 2s | P1 |
51
- | S-DATA-002 | Shopping history filter speed | Filter 800 past purchases by category | Results appear under 2s, no UI freeze | P2 |
52
- | S-DATA-003 | Meal plan calendar 6 months | Open 6-month plan view with 180 entries | Render within 3s, no layout shift | P2 |
53
- | S-DATA-004 | Finance ledger export 2000 rows | Export 2k ledger rows to CSV | Export completes, file accurate | P2 |
54
-
55
- ### Axis 3: ERROR
56
- | # | Scenario | Steps | Expected | Priority |
57
- | S-ERROR-001 | Undo/redo inventory quantity changes | Change item qty 5 times, undo 5, redo 5 | Exact state restored each step | P1 |
58
- | S-ERROR-002 | Auto-save recovery after crash | Edit meal notes, force close tab, reopen | Draft restored with last autosave | P1 |
59
- | S-ERROR-003 | Validation error messages | Add expense with negative value | Clear inline error, no save | P2 |
60
- | S-ERROR-004 | Failed bulk import rollback | Import malformed CSV for pantry | No partial data, error list shown | P1 |
61
-
62
- ### Axis 4: COLLAB
63
- | # | Scenario | Steps | Expected | Priority |
64
- | S-COLLAB-001 | Two users edit shopping list | User A adds 5 items, User B deletes 2 | Conflict warning, final list consistent | P1 |
65
- | S-COLLAB-002 | Concurrent budget updates | Two users change monthly budget | Latest change prompts merge dialog | P2 |
66
- | S-COLLAB-003 | Shared meal plan edit | User A updates recipe, User B updates servings | Both changes applied without loss | P2 |
67
- | S-COLLAB-004 | New member joins household | Invite new user during active edits | New user sees updated list | P3 |
68
-
69
- ### Axis 5: EMERGENCY
70
- | # | Scenario | Steps | Expected | Priority |
71
- | S-EMERGENCY-001 | Browser crash while editing | Edit grocery item notes, kill browser | Reopen, draft restored | P1 |
72
- | S-EMERGENCY-002 | Power loss during bulk update | Start bulk pantry update, go offline | Partial changes queued or rolled back | P1 |
73
- | S-EMERGENCY-003 | Device sleep mid-sync | Start sync, close laptop lid | Resume sync without duplication | P2 |
74
- | S-EMERGENCY-004 | App reload mid-transaction | Save expense, hit refresh instantly | No double charge, one entry saved | P2 |
75
-
76
- ### Axis 6: SECURITY
77
- | # | Scenario | Steps | Expected | Priority |
78
- | S-SECURITY-001 | Access revoked during edit | Admin removes user role mid-edit | User warned, changes blocked, data safe | P1 |
79
- | S-SECURITY-002 | Session expiry while shopping | Session expires, user adds item | Redirect to login, item queued | P1 |
80
- | S-SECURITY-003 | Audit log for finance edits | Edit expense amount | Audit entry with user, time, change | P2 |
81
- | S-SECURITY-004 | Private list access attempt | Non-member tries to open list | Access denied, no data leak | P1 |
82
-
83
- ### Axis 7: INFRA
84
- | # | Scenario | Steps | Expected | Priority |
85
- | S-INFRA-001 | Server crash during sync | Trigger sync, kill server | Retry logic, no data loss | P1 |
86
- | S-INFRA-002 | RTO < 15m recovery | Simulate outage, restore service | Service back within 15m, status updated | P1 |
87
- | S-INFRA-003 | RPO < 5m data recovery | Create 3 entries, failover | Max 5m data loss, latest persists | P1 |
88
- | S-INFRA-004 | Offline mode for shopping list | Go offline, add 10 items | Local cache used, sync on reconnect | P2 |
89
-
90
- ### Axis 8: LOCALE
91
- | # | Scenario | Steps | Expected | Priority |
92
- | S-LOCALE-001 | Diacritic-insensitive search | Search "nguyen" in household members | Finds "Nguyễn" matches | P1 |
93
- | S-LOCALE-002 | VND currency formatting | View finance summary | Shows "1.000.000đ" not "1,000,000" | P1 |
94
- | S-LOCALE-003 | Vietnamese text overflow | Open long Vietnamese recipe names | No overflow, wraps cleanly | P2 |
95
- | S-LOCALE-004 | Date format DD/MM/YYYY | View meal plan date header | Displays DD/MM/YYYY | P1 |
96
-
97
- ## Notes
98
- - Attach logs, screenshots, and timings for any P1 or P2 failures.
99
- - Capture device, OS, browser, and network conditions.
100
- - Link to any incident or bug IDs created from results.
@@ -1,155 +0,0 @@
1
- # RRI-T Test Cases — {Feature Name}
2
-
3
- **Feature:** {feature-name}
4
- **Generated from:** Persona Interview ({date})
5
- **Total Test Cases:** {count}
6
-
7
- ## Priority Distribution
8
- | Priority | Count | Description |
9
- |----------|-------|-------------|
10
- | P0 | 0 | Critical — blocks release |
11
- | P1 | 0 | Major — fix before release |
12
- | P2 | 0 | Minor — next sprint |
13
- | P3 | 0 | Trivial — backlog |
14
-
15
- ## Dimension Distribution
16
- | Dimension | Count | Target Coverage |
17
- |-----------|-------|----------------|
18
- | D1: UI/UX | 0 | >= 85% |
19
- | D2: API | 0 | >= 85% |
20
- | D3: Performance | 0 | >= 70% |
21
- | D4: Security | 0 | >= 85% |
22
- | D5: Data Integrity | 0 | >= 85% |
23
- | D6: Infrastructure | 0 | >= 70% |
24
- | D7: Edge Cases | 0 | >= 85% |
25
-
26
- ---
27
-
28
- ## Test Cases
29
-
30
- ### TC-RRI-{FEATURE}-001
31
- - **Q (Question):** As an end user, what happens when I add an inventory item while on a weak 3G connection?
32
- - **A (Answer):** The item should be saved locally immediately, show a "syncing" indicator, and sync to the server when connection improves. No data loss should occur.
33
- - **R (Requirement):** REQ-OFFLINE-001: App must support offline-first operations with automatic sync
34
- - **P (Priority):** P0
35
- - **T (Test Case):**
36
- - **Preconditions:**
37
- - User logged in to household
38
- - Device has weak 3G connection (simulated: 500ms latency, 50% packet loss)
39
- - At least 1 existing inventory item for comparison
40
- - **Steps:**
41
- 1. Navigate to Inventory screen
42
- 2. Tap "Add Item" button
43
- 3. Fill in: Name "Gạo ST25", Quantity "5", Unit "kg", Expiration "2026-03-15"
44
- 4. Tap "Save"
45
- 5. Observe UI feedback
46
- 6. Wait 30 seconds
47
- 7. Check item appears in inventory list
48
- 8. Restore normal network connection
49
- 9. Wait for sync indicator to complete
50
- 10. Verify item exists on server (check from another device)
51
- - **Expected Result:**
52
- - Item appears in list immediately with "syncing" badge
53
- - No error message shown
54
- - After network restores, item syncs successfully
55
- - Item visible from other devices within 5 seconds of sync
56
- - **Dimension:** D3: Performance
57
- - **Stress Axis:** TIME, INFRA
58
- - **Source Persona:** End User
59
- - **Result:** ✅ PASS
60
- - **Notes:** Tested on iPhone 12 with Network Link Conditioner. Sync completed in 3.2s after network restored.
61
-
62
- ---
63
-
64
- ### TC-RRI-{FEATURE}-002
65
- - **Q (Question):** As a business analyst, what happens when a household member with "viewer" role tries to delete an inventory item?
66
- - **A (Answer):** The delete button should be hidden or disabled for viewers. If they somehow trigger a delete (via API manipulation), the server should reject it with a 403 Forbidden error.
67
- - **R (Requirement):** REQ-RBAC-003: Viewers can only read data, not modify or delete
68
- - **P (Priority):** P1
69
- - **T (Test Case):**
70
- - **Preconditions:**
71
- - User "viewer@example.com" has "viewer" role in household "Test Family"
72
- - Household has inventory item "Sữa tươi" (ID: inv_123)
73
- - User logged in on mobile app
74
- - **Steps:**
75
- 1. Login as viewer@example.com
76
- 2. Navigate to Inventory screen
77
- 3. Tap on "Sữa tươi" item to view details
78
- 4. Look for delete button/option
79
- 5. (If delete button exists) Attempt to tap it
80
- 6. (Alternative) Use GraphQL client to send deleteInventoryItem mutation directly
81
- - **Expected Result:**
82
- - Delete button should not be visible in UI
83
- - If mutation sent directly, server returns error: `{"errors": [{"message": "Forbidden: insufficient permissions", "extensions": {"code": "FORBIDDEN"}}]}`
84
- - Item remains in database unchanged
85
- - **Dimension:** D4: Security
86
- - **Stress Axis:** SECURITY
87
- - **Source Persona:** Business Analyst
88
- - **Result:** ⚠️ PAINFUL
89
- - **Notes:** Delete button is correctly hidden, but when mutation sent via GraphQL Playground, error message is generic "Unauthorized" instead of specific "Forbidden: insufficient permissions". UX improvement: add clearer error messages for debugging. Item was NOT deleted (security works), but error clarity needs improvement.
90
-
91
- ---
92
-
93
- ### TC-RRI-{FEATURE}-003
94
- - **Q (Question):** As a QA destroyer, what happens when I paste 50,000 characters into the "item name" field?
95
- - **A (Answer):** The field should enforce a maximum length (e.g., 200 characters), truncate or reject input gracefully, and show a validation error. The app should not crash or freeze.
96
- - **R (Requirement):** REQ-VALIDATION-005: All text inputs must have reasonable length limits
97
- - **P (Priority):** P1
98
- - **T (Test Case):**
99
- - **Preconditions:**
100
- - User logged in
101
- - On "Add Inventory Item" screen
102
- - Clipboard contains 50,000-character string
103
- - **Steps:**
104
- 1. Tap into "Item Name" field
105
- 2. Paste 50,000-character string
106
- 3. Observe UI behavior
107
- 4. Attempt to save the form
108
- - **Expected Result:**
109
- - Field truncates input to max length (200 chars) OR shows validation error
110
- - UI remains responsive (no freeze)
111
- - Save button disabled or shows error: "Item name too long (max 200 characters)"
112
- - No crash or GraphQL error
113
- - **Dimension:** D7: Edge Cases
114
- - **Stress Axis:** DATA, ERROR
115
- - **Source Persona:** QA Destroyer
116
- - **Result:** ☐ MISSING
117
- - **Notes:** Feature not yet implemented. Current behavior: field accepts all 50,000 characters, UI freezes for 2-3 seconds, GraphQL mutation fails with "Payload too large" error. Need to add client-side validation and maxLength attribute.
118
-
119
- ---
120
-
121
- ### TC-RRI-{FEATURE}-004
122
- - **Q (Question):** {From persona's perspective — what are they trying to do/verify?}
123
- - **A (Answer):** {Expected behavior — what SHOULD happen}
124
- - **R (Requirement):** {Requirement ID or description}
125
- - **P (Priority):** P0 | P1 | P2 | P3
126
- - **T (Test Case):**
127
- - **Preconditions:** {required state}
128
- - **Steps:**
129
- 1. {step 1}
130
- 2. {step 2}
131
- - **Expected Result:** {specific, measurable outcome}
132
- - **Dimension:** D{n}: {name}
133
- - **Stress Axis:** {axis name} (if applicable)
134
- - **Source Persona:** {persona name}
135
- - **Result:** ✅ PASS | ❌ FAIL | ⚠️ PAINFUL | ☐ MISSING
136
- - **Notes:** {observations, screenshots, bug IDs}
137
-
138
- ---
139
-
140
- ### TC-RRI-{FEATURE}-005
141
- - **Q (Question):** {From persona's perspective — what are they trying to do/verify?}
142
- - **A (Answer):** {Expected behavior — what SHOULD happen}
143
- - **R (Requirement):** {Requirement ID or description}
144
- - **P (Priority):** P0 | P1 | P2 | P3
145
- - **T (Test Case):**
146
- - **Preconditions:** {required state}
147
- - **Steps:**
148
- 1. {step 1}
149
- 2. {step 2}
150
- - **Expected Result:** {specific, measurable outcome}
151
- - **Dimension:** D{n}: {name}
152
- - **Stress Axis:** {axis name} (if applicable)
153
- - **Source Persona:** {persona name}
154
- - **Result:** ✅ PASS | ❌ FAIL | ⚠️ PAINFUL | ☐ MISSING
155
- - **Notes:** {observations, screenshots, bug IDs}
@@ -1,9 +0,0 @@
1
- {
2
- "name": "rri-t-testing",
3
- "version": "1.0.0",
4
- "description": "RRI-T QA methodology — 5-phase testing (PREPARE, DISCOVER, STRUCTURE, EXECUTE, ANALYZE) with 7 dimensions, 5 personas, and release gates",
5
- "compatibility": "OpenCode",
6
- "agent": null,
7
- "commands": [],
8
- "tags": ["testing", "qa", "rri-t", "release-gates", "test-cases"]
9
- }