@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.
@@ -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
+