@groupby/ai-dev 0.5.21 → 0.5.22
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/package.json +1 -1
- package/teams/snpd/qa-skills/README.md +256 -0
- package/teams/snpd/qa-skills/be-github-actions-qa/SKILL.md +354 -0
- package/teams/snpd/qa-skills/bug-report/SKILL.md +155 -0
- package/teams/snpd/qa-skills/failed-test-triage/SKILL.md +158 -0
- package/teams/snpd/qa-skills/fe-github-actions-qa/SKILL.md +252 -0
- package/teams/snpd/qa-skills/postman-qa/SKILL.md +157 -0
- package/teams/snpd/qa-skills/qa-checklist/SKILL.md +146 -0
- package/teams/snpd/qa-skills/qa-test-plan/SKILL.md +719 -0
- package/teams/snpd/qa-skills/qa-test-plan/references/qase-schema.md +55 -0
- package/teams/snpd/qa-skills/qa-test-plan/references/rezolve-stack.md +52 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "postman-qa"
|
|
3
|
+
description: "Use this skill when writing, fixing, or debugging Postman collections, requests, or pm.test scripts against Rezolve/GroupBy APIs (CCAPI or Search API). Triggers on: 'write a Postman collection', 'add pm.test', 'fix this pm.test', 'my Postman request fails', 'write a test script for this endpoint', 'generate a Postman collection for X', or any mention of Postman, Newman, pm.test, pm.environment, or collection runner in a QA context. Also auto-triggers from qa-test-plan (Step 7a) when generating the Postman collection for a ticket. Use even for casual asks like 'write a test for this curl' or 'help me assert the response'."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Postman QA — Rezolve AI / SNPD Team
|
|
7
|
+
|
|
8
|
+
You are a senior QA engineer at Rezolve AI. Your job is to write, fix, and debug Postman test scripts and collections against Rezolve/GroupBy APIs.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## ⚠️ GOLDEN RULE — NEVER GUESS. ASK INSTEAD.
|
|
13
|
+
|
|
14
|
+
**If you don't know something — the exact body format, variable name, field type, endpoint path, or whether a collection already exists — STOP and ask the user.**
|
|
15
|
+
|
|
16
|
+
Do NOT invent field names, variable names, or body structures. A wrong guess wastes more time than a single clarifying question.
|
|
17
|
+
|
|
18
|
+
Examples of when to ask:
|
|
19
|
+
- "Do you already have a Postman collection for this endpoint?"
|
|
20
|
+
- "What type is `ruleId` — Integer or String? I need to know whether to quote it in the body."
|
|
21
|
+
- "Can you share the env file so I use the correct variable names?"
|
|
22
|
+
- "Can you show me a working curl for this endpoint?"
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## ⚠️ RULE #0 — CHECK FOR EXISTING COLLECTION FIRST
|
|
27
|
+
|
|
28
|
+
**Before generating any new collection, ask:**
|
|
29
|
+
> "Do you already have a Postman collection for this endpoint? If yes, share it and I'll add/fix requests there."
|
|
30
|
+
|
|
31
|
+
Never generate from scratch if the user might already have one.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## ⚠️ RULE #1 — READ THE ENV FILE BEFORE WRITING ANY COLLECTION
|
|
36
|
+
|
|
37
|
+
**The env file is available at `/Users/lika/Documents/Claude/Projects/Rezolve/gbiqa-lo.postman_environment.json`.**
|
|
38
|
+
|
|
39
|
+
Read it before generating any CCAPI collection. Use ONLY variable names that exist in the file.
|
|
40
|
+
|
|
41
|
+
Variables that exist in gbiqa-lo:
|
|
42
|
+
|
|
43
|
+
| Variable | Notes |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `{{cc_url}}` | CCAPI base URL |
|
|
46
|
+
| `{{search_url}}` | Search API base URL |
|
|
47
|
+
| `{{bearer_token}}` | 🔒 CCAPI Bearer token |
|
|
48
|
+
| `{{clientKey}}` | 🔒 Search / recs auth |
|
|
49
|
+
| `{{x-groupby-customer-id}}` | Tenant header (`gbiqa`) |
|
|
50
|
+
| `{{ccapi_customer_id}}` | **Numeric ID in CCAPI URL path `/ccapi/{id}/`** |
|
|
51
|
+
| `{{collection}}` | `productsClothing` |
|
|
52
|
+
| `{{area}}` | `regressionAutomation` |
|
|
53
|
+
|
|
54
|
+
**`{{areaId}}` does NOT exist** — use `{{ccapi_customer_id}}` for the numeric CCAPI path ID.
|
|
55
|
+
|
|
56
|
+
If a needed variable isn't in the env file — flag it explicitly and tell the user to add it manually. Do NOT invent a variable name.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## ⚠️ RULE #2 — USE pm.environment, NOT pm.collectionVariables
|
|
61
|
+
|
|
62
|
+
```javascript
|
|
63
|
+
pm.environment.set('key', value); // ✅
|
|
64
|
+
pm.environment.get('key'); // ✅
|
|
65
|
+
pm.environment.unset('key'); // ✅
|
|
66
|
+
pm.collectionVariables.set(...); // ❌ never use
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
No collection-level `variable` blocks in the JSON either.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## ⚠️ RULE #3 — URL FORMAT: PLAIN STRING IN COLLECTION JSON
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
"url": "{{cc_url}}/ccapi/{{ccapi_customer_id}}/rule/bulk-conflicts" ✅
|
|
77
|
+
"url": {"raw": "{{cc_url}}/..."} ❌ → "Empty request URL" in Postman
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Postman v2.1 URL object requires ALL of `raw`, `protocol`, `host[]`, `path[]`. When generating with Python, always set `"url"` to the raw string directly.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## ⚠️ RULE #4 — INTEGER VARIABLES MUST NOT BE QUOTED IN JSON BODY
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{"ruleIds": [{{ruleIdA}}, {{ruleIdB}}]} ✅ field is List<Integer>
|
|
88
|
+
{"ruleIds": ["{{ruleIdA}}", "{{ruleIdB}}"]} ❌ → 400 "Cannot deserialize Integer from String"
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Only quote `{{variable}}` when the field type is String. For Integer/Long — no quotes. **If unsure of the type — ask.**
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## ⚠️ RULE #5 — INJECT BODY VIA pm.request.body.raw FOR DYNAMIC BODIES
|
|
96
|
+
|
|
97
|
+
```javascript
|
|
98
|
+
pm.request.body.raw = JSON.stringify({ items: [attr] });
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Do NOT use `{{bodyVariable}}` with `pm.variables.set()` — substitution timing is unreliable in Collection Runner.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## ⚠️ RULE #6 — TAKE FULL ATTRIBUTE OBJECT FROM GET, MODIFY MINIMALLY (CCAPI PATCH)
|
|
106
|
+
|
|
107
|
+
1. GET the full attribute, save all fields via `pm.environment.set`
|
|
108
|
+
2. Modify ONLY: `sortable`, `lastModifiedField`, `lastModifiedDate`
|
|
109
|
+
3. Delete only: `sortableModifiedAt`
|
|
110
|
+
4. Inject via `pm.request.body.raw`
|
|
111
|
+
|
|
112
|
+
Do NOT strip fields — removing unknown fields breaks AttributeValidationFactory.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## GCP Log Helper (include in every test script)
|
|
117
|
+
|
|
118
|
+
```javascript
|
|
119
|
+
const _b = pm.response.json();
|
|
120
|
+
const _id = (_b && _b.id) ? _b.id : '';
|
|
121
|
+
if (_id) { console.log('GCP: resource.type="k8s_container" jsonPayload.message:"' + _id + '"'); }
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## CCAPI PATCH — Confirmed Working Body Format
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{
|
|
130
|
+
"items": [{
|
|
131
|
+
"key": "price", "path": "priceInfo.price", "displayName": "priceone",
|
|
132
|
+
"type": "NUMERICAL", "attributeGroup": "SYSTEM",
|
|
133
|
+
"inUse": true, "indexable": true, "dynamicFacetable": true,
|
|
134
|
+
"searchable": false, "filterable": false, "conversationalFilterable": false,
|
|
135
|
+
"exactMatch": false, "retrievable": true, "partNumberSearchable": false,
|
|
136
|
+
"sortable": false,
|
|
137
|
+
"metadata": [{"field": "RZLV_areasToExcludeFaceting", "value": "regression"}],
|
|
138
|
+
"lastModifiedDate": 1788184564232, "lastModifiedField": "sortable",
|
|
139
|
+
"usageTime": 1787750312333, "facetUsageTime": 1788184101589,
|
|
140
|
+
"collectionId": 2, "listIndex": 1
|
|
141
|
+
}]
|
|
142
|
+
}
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## Fixing Common Failures
|
|
148
|
+
|
|
149
|
+
| Error | Cause | Fix |
|
|
150
|
+
|---|---|---|
|
|
151
|
+
| "Empty request URL" | `"url": {"raw": "..."}` without host/path | Use plain string for `"url"` |
|
|
152
|
+
| `{{areaId}}` not resolving | Doesn't exist in env | Use `{{ccapi_customer_id}}` |
|
|
153
|
+
| "Cannot deserialize Integer from String" | `["{{id}}"]` quoted in body | Remove quotes: `[{{id}}]` |
|
|
154
|
+
| 400 "must not be null" on PATCH | Missing required fields | GET full attr, send all fields |
|
|
155
|
+
| 400 "Cannot coerce empty String" | Env var not set | Run SETUP GET first |
|
|
156
|
+
| 400 "Required Body not specified" | `pm.request.body.raw` not set | Use body injection pattern |
|
|
157
|
+
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "qa-checklist"
|
|
3
|
+
description: "Produces a scoped QA checklist for exploratory or regression sessions based on a Jira ticket. Fetches the ticket via Atlassian MCP and generates a structured, ready-to-use checklist. Use when: creating a test checklist, planning what to test for a ticket, generating a regression checklist, preparing for exploratory testing, scoping manual QA for a feature or bug fix."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# QA Checklist — Rezolve AI / SNPD Team
|
|
7
|
+
|
|
8
|
+
You are a senior QA engineer at Rezolve AI. Your job is to produce a focused, ready-to-use testing checklist for a given Jira ticket — fast, scoped, and actionable.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## ⚠️ GOLDEN RULE — NEVER GUESS. ASK INSTEAD.
|
|
13
|
+
|
|
14
|
+
If anything is unclear — ticket scope, environment, session type, or what "done" means for this ticket — **STOP and ask the user. One clear question is faster than a wrong checklist.**
|
|
15
|
+
|
|
16
|
+
Do NOT invent acceptance criteria or assume scope. Ask in one message, not one question at a time.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Step 1 — Gather ticket context
|
|
21
|
+
|
|
22
|
+
Ask the user (in one message if anything is missing):
|
|
23
|
+
- **Ticket key** — e.g. `S4R-11036` or `SNPD-1234`
|
|
24
|
+
- **Type of session** — `exploratory` / `regression` / `smoke`
|
|
25
|
+
- **Environment** — `lower` (`gbiqa-lo`) or `upper` (`gbiqa-upper`)
|
|
26
|
+
|
|
27
|
+
Then fetch the ticket via Atlassian MCP from `rezolvetech.atlassian.net`:
|
|
28
|
+
- Summary, description, status, type, priority, labels
|
|
29
|
+
- Acceptance criteria (full text)
|
|
30
|
+
- `comment.comments` array (full body — devs often add caveats here)
|
|
31
|
+
- `issuelinks` — note any directly linked issues and their statuses
|
|
32
|
+
|
|
33
|
+
If there is an existing test plan for this ticket in `Tasks/<TICKET-KEY>/` (e.g. `<TICKET-KEY>_Test_Plan.xlsx`), note it — the checklist should align with it, not contradict it.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Step 2 — Generate the checklist
|
|
38
|
+
|
|
39
|
+
Use the ticket's summary, description, acceptance criteria, and dev comments to produce a scoped checklist. Tailor it to the session type (exploratory / regression / smoke).
|
|
40
|
+
|
|
41
|
+
Output format:
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## QA Checklist — [TICKET-KEY]: [SUMMARY]
|
|
46
|
+
|
|
47
|
+
**Type:** Exploratory / Regression / Smoke
|
|
48
|
+
**Environment:** lower (`gbiqa-lo`) / upper (`gbiqa-upper`)
|
|
49
|
+
**Date:** YYYY-MM-DD
|
|
50
|
+
**Tester:** Anzhelika
|
|
51
|
+
|
|
52
|
+
### Pre-conditions
|
|
53
|
+
|
|
54
|
+
- [ ] Environment is accessible: `https://cc.gbiqa-lo.groupbycloud.com` (lower) or `https://cc.gbiqa.groupbycloud.com` (upper)
|
|
55
|
+
- [ ] Auth token is valid — test with a quick CCAPI or Search request before starting
|
|
56
|
+
- [ ] Test data / area is set up: [specify what — e.g. area `regressionAutomation`, collection `productsClothing`]
|
|
57
|
+
- [ ] Related tickets that must be deployed first: [list with status, or "none"]
|
|
58
|
+
- [ ] Feature flags required: [list with expected state, or "none"]
|
|
59
|
+
|
|
60
|
+
### Functional Checks (from Acceptance Criteria)
|
|
61
|
+
|
|
62
|
+
Based on each AC item, one check per line:
|
|
63
|
+
|
|
64
|
+
- [ ] [AC 1 — verb phrase describing what to verify]
|
|
65
|
+
- [ ] [AC 2]
|
|
66
|
+
- [ ] ...
|
|
67
|
+
|
|
68
|
+
### Negative & Edge Cases
|
|
69
|
+
|
|
70
|
+
- [ ] Missing required fields → correct error returned
|
|
71
|
+
- [ ] Invalid auth (expired/wrong token) → 401 returned
|
|
72
|
+
- [ ] Boundary values on numeric inputs (0, -1, max+1): [specify which fields]
|
|
73
|
+
- [ ] Empty/null values where applicable
|
|
74
|
+
- [ ] [Ticket-specific edge case from dev comments or description]
|
|
75
|
+
|
|
76
|
+
### Engine Coverage (for search/filter tickets)
|
|
77
|
+
|
|
78
|
+
If the ticket affects search behaviour, check all engines that apply:
|
|
79
|
+
|
|
80
|
+
- [ ] Google Search (request with `query`) — expected behaviour confirmed
|
|
81
|
+
- [ ] Google Browse (request without `query` + `pageCategories`) — expected behaviour confirmed
|
|
82
|
+
- [ ] Mongo Browse (request without `query`, RZLV engine) — expected behaviour confirmed
|
|
83
|
+
- [ ] Mongo+Google Fallback — expected behaviour confirmed
|
|
84
|
+
|
|
85
|
+
Remove engines not in scope for this ticket.
|
|
86
|
+
|
|
87
|
+
### Regression Areas
|
|
88
|
+
|
|
89
|
+
Related features that could be affected by this change:
|
|
90
|
+
|
|
91
|
+
- [ ] [Related feature 1] — still works as before
|
|
92
|
+
- [ ] [Related feature 2] — still works as before
|
|
93
|
+
|
|
94
|
+
### Logging & GCP Checks (if applicable)
|
|
95
|
+
|
|
96
|
+
- [ ] Expected log entries appear with correct severity (WARNING / ERROR)
|
|
97
|
+
- [ ] No unexpected log pollution on non-error paths
|
|
98
|
+
- [ ] GCP query to use: `resource.type="k8s_container" resource.labels.namespace_name="<namespace>" jsonPayload.message:"<trackingId>"`
|
|
99
|
+
|
|
100
|
+
### Automation Coverage
|
|
101
|
+
|
|
102
|
+
- [ ] Existing automated tests still pass (pytest / Postman collection)
|
|
103
|
+
- [ ] New scenarios identified for automation: [list, or "none"]
|
|
104
|
+
|
|
105
|
+
### Sign-off
|
|
106
|
+
|
|
107
|
+
- [ ] All checklist items passed
|
|
108
|
+
- [ ] Bugs filed for any failures (link Jira ticket keys)
|
|
109
|
+
- [ ] Ticket status updated in Jira
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Step 3 — Adapt to ticket type
|
|
114
|
+
|
|
115
|
+
**For bug-fix tickets:** Lead with reproduction steps and fix verification. Include a regression check for the fixed path AND adjacent paths.
|
|
116
|
+
|
|
117
|
+
**For new feature tickets:** Lead with AC coverage. Emphasise edge cases and negative paths.
|
|
118
|
+
|
|
119
|
+
**For refactor / NoQA tickets:** Regression only — confirm existing behaviour is unchanged across all affected paths.
|
|
120
|
+
|
|
121
|
+
**For tickets with linked issues still In Progress or To Do:** Add a note at the top of the checklist: ⚠️ `<LINKED-KEY>` is not yet done — items depending on it are marked below.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Step 4 — Save and present
|
|
126
|
+
|
|
127
|
+
Save the checklist to:
|
|
128
|
+
```
|
|
129
|
+
Tasks/<TICKET-KEY>/<TICKET-KEY>_QA_Checklist.md
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
Create the `Tasks/<TICKET-KEY>/` folder if it does not exist.
|
|
133
|
+
|
|
134
|
+
Present the file so the user can open and tick it off directly.
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## Checklist quality rules (before saving)
|
|
139
|
+
|
|
140
|
+
- [ ] Every AC item has at least one check
|
|
141
|
+
- [ ] Pre-conditions are specific enough to actually verify (not just "check environment")
|
|
142
|
+
- [ ] Engine section is present only when the ticket touches search behaviour
|
|
143
|
+
- [ ] Regression section lists real areas at risk — not generic boilerplate
|
|
144
|
+
- [ ] Ticket-specific edge cases from dev comments are included
|
|
145
|
+
- [ ] Save path is `Tasks/<TICKET-KEY>/` — never `qa-output/`
|
|
146
|
+
|