@ivorycanvas/qamap 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +93 -0
- package/LICENSE +21 -0
- package/README.md +636 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +879 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +114 -0
- package/dist/config.js.map +1 -0
- package/dist/context.d.ts +1 -0
- package/dist/context.js +126 -0
- package/dist/context.js.map +1 -0
- package/dist/doctor.d.ts +32 -0
- package/dist/doctor.js +200 -0
- package/dist/doctor.js.map +1 -0
- package/dist/domain-language.d.ts +25 -0
- package/dist/domain-language.js +655 -0
- package/dist/domain-language.js.map +1 -0
- package/dist/domains.d.ts +33 -0
- package/dist/domains.js +258 -0
- package/dist/domains.js.map +1 -0
- package/dist/e2e.d.ts +326 -0
- package/dist/e2e.js +6869 -0
- package/dist/e2e.js.map +1 -0
- package/dist/eval.d.ts +40 -0
- package/dist/eval.js +374 -0
- package/dist/eval.js.map +1 -0
- package/dist/flows.d.ts +32 -0
- package/dist/flows.js +246 -0
- package/dist/flows.js.map +1 -0
- package/dist/fs.d.ts +7 -0
- package/dist/fs.js +132 -0
- package/dist/fs.js.map +1 -0
- package/dist/github.d.ts +34 -0
- package/dist/github.js +183 -0
- package/dist/github.js.map +1 -0
- package/dist/history.d.ts +173 -0
- package/dist/history.js +247 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest-suggestions.d.ts +67 -0
- package/dist/manifest-suggestions.js +673 -0
- package/dist/manifest-suggestions.js.map +1 -0
- package/dist/manifest.d.ts +212 -0
- package/dist/manifest.js +1607 -0
- package/dist/manifest.js.map +1 -0
- package/dist/qa.d.ts +53 -0
- package/dist/qa.js +361 -0
- package/dist/qa.js.map +1 -0
- package/dist/report.d.ts +5 -0
- package/dist/report.js +164 -0
- package/dist/report.js.map +1 -0
- package/dist/review.d.ts +31 -0
- package/dist/review.js +383 -0
- package/dist/review.js.map +1 -0
- package/dist/scanner.d.ts +3 -0
- package/dist/scanner.js +797 -0
- package/dist/scanner.js.map +1 -0
- package/dist/severity.d.ts +3 -0
- package/dist/severity.js +9 -0
- package/dist/severity.js.map +1 -0
- package/dist/test-evidence.d.ts +39 -0
- package/dist/test-evidence.js +303 -0
- package/dist/test-evidence.js.map +1 -0
- package/dist/test-plan.d.ts +35 -0
- package/dist/test-plan.js +573 -0
- package/dist/test-plan.js.map +1 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/verify.d.ts +27 -0
- package/dist/verify.js +244 -0
- package/dist/verify.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/docs/adoption.md +166 -0
- package/docs/agent-skill.md +94 -0
- package/docs/api-contracts.md +30 -0
- package/docs/assets/qamap-30s-demo.gif +0 -0
- package/docs/configuration.md +277 -0
- package/docs/e2e-output-examples.md +464 -0
- package/docs/ecosystem.md +41 -0
- package/docs/eval.md +52 -0
- package/docs/github-action.md +89 -0
- package/docs/manifest.md +350 -0
- package/docs/quickstart-demo.md +268 -0
- package/docs/release-validation.md +247 -0
- package/docs/releasing.md +112 -0
- package/docs/roadmap.md +67 -0
- package/docs/rules.md +28 -0
- package/docs/verify.md +44 -0
- package/package.json +80 -0
- package/schema/qamap-manifest.schema.json +323 -0
- package/schema/qamap.schema.json +58 -0
- package/skills/qamap-pr-qa/SKILL.md +81 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/IvoryCanvas/qamap/main/schema/qamap-manifest.schema.json",
|
|
4
|
+
"title": "QAMap verification manifest",
|
|
5
|
+
"description": "Repository-local verification knowledge used by QAMap to map branch changes to domains, flows, anchors, checks, and E2E draft requirements.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["version", "domains", "flows"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"$schema": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"description": "Optional JSON Schema URL for editor validation."
|
|
13
|
+
},
|
|
14
|
+
"version": {
|
|
15
|
+
"const": 1
|
|
16
|
+
},
|
|
17
|
+
"domains": {
|
|
18
|
+
"type": "array",
|
|
19
|
+
"description": "Product or repository areas that map changed files to team language.",
|
|
20
|
+
"items": {
|
|
21
|
+
"$ref": "#/$defs/domain"
|
|
22
|
+
},
|
|
23
|
+
"default": []
|
|
24
|
+
},
|
|
25
|
+
"context": {
|
|
26
|
+
"$ref": "#/$defs/context"
|
|
27
|
+
},
|
|
28
|
+
"flows": {
|
|
29
|
+
"type": "array",
|
|
30
|
+
"description": "User, API, command, or artifact flows that should shape PR verification evidence.",
|
|
31
|
+
"items": {
|
|
32
|
+
"$ref": "#/$defs/flow"
|
|
33
|
+
},
|
|
34
|
+
"default": []
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"$defs": {
|
|
38
|
+
"id": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"minLength": 1,
|
|
41
|
+
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
|
|
42
|
+
},
|
|
43
|
+
"sourceKind": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"enum": ["declared", "inferred"]
|
|
46
|
+
},
|
|
47
|
+
"confidence": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"enum": ["low", "medium", "high"]
|
|
50
|
+
},
|
|
51
|
+
"criticality": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"enum": ["low", "medium", "high"]
|
|
54
|
+
},
|
|
55
|
+
"runner": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"enum": ["manual", "maestro", "playwright"]
|
|
58
|
+
},
|
|
59
|
+
"anchorKind": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"enum": ["api", "component", "file", "route", "test"]
|
|
62
|
+
},
|
|
63
|
+
"checkType": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"enum": ["contract", "edge", "failure", "success", "visual"]
|
|
66
|
+
},
|
|
67
|
+
"instructionKind": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"enum": ["adr", "agent-instruction", "context", "goal", "qa-runbook", "release-runbook", "runbook", "test-runbook"]
|
|
70
|
+
},
|
|
71
|
+
"instructionRole": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"enum": ["agent-skill", "domain-context", "harness-config", "release-policy", "safety-policy", "test-runner", "verification-rubric", "workflow-lifecycle"]
|
|
74
|
+
},
|
|
75
|
+
"source": {
|
|
76
|
+
"type": "object",
|
|
77
|
+
"additionalProperties": false,
|
|
78
|
+
"required": ["kind", "confidence", "from"],
|
|
79
|
+
"properties": {
|
|
80
|
+
"kind": {
|
|
81
|
+
"$ref": "#/$defs/sourceKind"
|
|
82
|
+
},
|
|
83
|
+
"confidence": {
|
|
84
|
+
"$ref": "#/$defs/confidence"
|
|
85
|
+
},
|
|
86
|
+
"from": {
|
|
87
|
+
"type": "array",
|
|
88
|
+
"items": {
|
|
89
|
+
"type": "string",
|
|
90
|
+
"minLength": 1
|
|
91
|
+
},
|
|
92
|
+
"uniqueItems": true
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"instructionFile": {
|
|
97
|
+
"type": "object",
|
|
98
|
+
"additionalProperties": false,
|
|
99
|
+
"required": ["path", "kind", "confidence", "signals"],
|
|
100
|
+
"properties": {
|
|
101
|
+
"path": {
|
|
102
|
+
"type": "string",
|
|
103
|
+
"minLength": 1
|
|
104
|
+
},
|
|
105
|
+
"kind": {
|
|
106
|
+
"$ref": "#/$defs/instructionKind"
|
|
107
|
+
},
|
|
108
|
+
"confidence": {
|
|
109
|
+
"$ref": "#/$defs/confidence"
|
|
110
|
+
},
|
|
111
|
+
"roles": {
|
|
112
|
+
"type": "array",
|
|
113
|
+
"description": "Advisory role classification for the context source, such as verification rubric, workflow lifecycle, harness config, or agent skill.",
|
|
114
|
+
"items": {
|
|
115
|
+
"$ref": "#/$defs/instructionRole"
|
|
116
|
+
},
|
|
117
|
+
"uniqueItems": true,
|
|
118
|
+
"default": []
|
|
119
|
+
},
|
|
120
|
+
"signals": {
|
|
121
|
+
"type": "array",
|
|
122
|
+
"items": {
|
|
123
|
+
"type": "string",
|
|
124
|
+
"minLength": 1
|
|
125
|
+
},
|
|
126
|
+
"uniqueItems": true
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
"context": {
|
|
131
|
+
"type": "object",
|
|
132
|
+
"additionalProperties": false,
|
|
133
|
+
"required": ["instructionFiles", "validationCommands", "safetyRules", "source"],
|
|
134
|
+
"properties": {
|
|
135
|
+
"instructionFiles": {
|
|
136
|
+
"type": "array",
|
|
137
|
+
"description": "Advisory context files used to bootstrap manifest quality, such as CONTEXT.md, ADRs, goals, agent instructions, and QA runbooks.",
|
|
138
|
+
"items": {
|
|
139
|
+
"$ref": "#/$defs/instructionFile"
|
|
140
|
+
},
|
|
141
|
+
"default": []
|
|
142
|
+
},
|
|
143
|
+
"validationCommands": {
|
|
144
|
+
"type": "array",
|
|
145
|
+
"description": "Validation commands inferred from context files. These are hints until reviewed.",
|
|
146
|
+
"items": {
|
|
147
|
+
"type": "string",
|
|
148
|
+
"minLength": 1
|
|
149
|
+
},
|
|
150
|
+
"uniqueItems": true,
|
|
151
|
+
"default": []
|
|
152
|
+
},
|
|
153
|
+
"safetyRules": {
|
|
154
|
+
"type": "array",
|
|
155
|
+
"description": "Safety or workflow rules inferred from context files. These are advisory and may not be product truth.",
|
|
156
|
+
"items": {
|
|
157
|
+
"type": "string",
|
|
158
|
+
"minLength": 1
|
|
159
|
+
},
|
|
160
|
+
"uniqueItems": true,
|
|
161
|
+
"default": []
|
|
162
|
+
},
|
|
163
|
+
"source": {
|
|
164
|
+
"$ref": "#/$defs/source"
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
},
|
|
168
|
+
"domain": {
|
|
169
|
+
"type": "object",
|
|
170
|
+
"additionalProperties": false,
|
|
171
|
+
"required": ["id", "name", "paths", "criticality", "source"],
|
|
172
|
+
"properties": {
|
|
173
|
+
"id": {
|
|
174
|
+
"$ref": "#/$defs/id"
|
|
175
|
+
},
|
|
176
|
+
"name": {
|
|
177
|
+
"type": "string",
|
|
178
|
+
"minLength": 1
|
|
179
|
+
},
|
|
180
|
+
"paths": {
|
|
181
|
+
"type": "array",
|
|
182
|
+
"description": "Glob-like path patterns relative to the manifest root.",
|
|
183
|
+
"items": {
|
|
184
|
+
"type": "string",
|
|
185
|
+
"minLength": 1
|
|
186
|
+
},
|
|
187
|
+
"minItems": 1,
|
|
188
|
+
"uniqueItems": true
|
|
189
|
+
},
|
|
190
|
+
"criticality": {
|
|
191
|
+
"$ref": "#/$defs/criticality"
|
|
192
|
+
},
|
|
193
|
+
"source": {
|
|
194
|
+
"$ref": "#/$defs/source"
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
"entry": {
|
|
199
|
+
"type": "object",
|
|
200
|
+
"additionalProperties": false,
|
|
201
|
+
"required": ["source"],
|
|
202
|
+
"properties": {
|
|
203
|
+
"route": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"minLength": 1
|
|
206
|
+
},
|
|
207
|
+
"source": {
|
|
208
|
+
"$ref": "#/$defs/sourceKind"
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
},
|
|
212
|
+
"anchor": {
|
|
213
|
+
"type": "object",
|
|
214
|
+
"additionalProperties": false,
|
|
215
|
+
"required": ["kind", "source", "confidence"],
|
|
216
|
+
"anyOf": [
|
|
217
|
+
{ "required": ["path"] },
|
|
218
|
+
{ "required": ["route"] },
|
|
219
|
+
{ "required": ["symbol"] }
|
|
220
|
+
],
|
|
221
|
+
"properties": {
|
|
222
|
+
"kind": {
|
|
223
|
+
"$ref": "#/$defs/anchorKind"
|
|
224
|
+
},
|
|
225
|
+
"path": {
|
|
226
|
+
"type": "string",
|
|
227
|
+
"minLength": 1
|
|
228
|
+
},
|
|
229
|
+
"route": {
|
|
230
|
+
"type": "string",
|
|
231
|
+
"minLength": 1
|
|
232
|
+
},
|
|
233
|
+
"symbol": {
|
|
234
|
+
"type": "string",
|
|
235
|
+
"minLength": 1
|
|
236
|
+
},
|
|
237
|
+
"source": {
|
|
238
|
+
"$ref": "#/$defs/sourceKind"
|
|
239
|
+
},
|
|
240
|
+
"confidence": {
|
|
241
|
+
"$ref": "#/$defs/confidence"
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
},
|
|
245
|
+
"check": {
|
|
246
|
+
"type": "object",
|
|
247
|
+
"additionalProperties": false,
|
|
248
|
+
"required": ["id", "title", "type"],
|
|
249
|
+
"properties": {
|
|
250
|
+
"id": {
|
|
251
|
+
"$ref": "#/$defs/id"
|
|
252
|
+
},
|
|
253
|
+
"title": {
|
|
254
|
+
"type": "string",
|
|
255
|
+
"minLength": 1
|
|
256
|
+
},
|
|
257
|
+
"type": {
|
|
258
|
+
"$ref": "#/$defs/checkType"
|
|
259
|
+
},
|
|
260
|
+
"selector": {
|
|
261
|
+
"type": "string",
|
|
262
|
+
"description": "Optional stable selector hint used when QAMap turns this check into a draft step, such as [data-testid=coupon-input] or role=button:Apply.",
|
|
263
|
+
"minLength": 1
|
|
264
|
+
},
|
|
265
|
+
"value": {
|
|
266
|
+
"type": "string",
|
|
267
|
+
"description": "Optional sample value for input-like checks, such as WELCOME10 or qa@example.com.",
|
|
268
|
+
"minLength": 1
|
|
269
|
+
},
|
|
270
|
+
"steps": {
|
|
271
|
+
"type": "array",
|
|
272
|
+
"description": "Optional concrete human-readable steps for this check. QAMap uses them before falling back to title parsing.",
|
|
273
|
+
"items": {
|
|
274
|
+
"type": "string",
|
|
275
|
+
"minLength": 1
|
|
276
|
+
},
|
|
277
|
+
"uniqueItems": true,
|
|
278
|
+
"default": []
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
},
|
|
282
|
+
"flow": {
|
|
283
|
+
"type": "object",
|
|
284
|
+
"additionalProperties": false,
|
|
285
|
+
"required": ["id", "name", "anchors", "checks", "source"],
|
|
286
|
+
"properties": {
|
|
287
|
+
"id": {
|
|
288
|
+
"$ref": "#/$defs/id"
|
|
289
|
+
},
|
|
290
|
+
"domain": {
|
|
291
|
+
"$ref": "#/$defs/id"
|
|
292
|
+
},
|
|
293
|
+
"name": {
|
|
294
|
+
"type": "string",
|
|
295
|
+
"minLength": 1
|
|
296
|
+
},
|
|
297
|
+
"entry": {
|
|
298
|
+
"$ref": "#/$defs/entry"
|
|
299
|
+
},
|
|
300
|
+
"runner": {
|
|
301
|
+
"$ref": "#/$defs/runner"
|
|
302
|
+
},
|
|
303
|
+
"anchors": {
|
|
304
|
+
"type": "array",
|
|
305
|
+
"items": {
|
|
306
|
+
"$ref": "#/$defs/anchor"
|
|
307
|
+
},
|
|
308
|
+
"minItems": 1
|
|
309
|
+
},
|
|
310
|
+
"checks": {
|
|
311
|
+
"type": "array",
|
|
312
|
+
"items": {
|
|
313
|
+
"$ref": "#/$defs/check"
|
|
314
|
+
},
|
|
315
|
+
"minItems": 1
|
|
316
|
+
},
|
|
317
|
+
"source": {
|
|
318
|
+
"$ref": "#/$defs/source"
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://raw.githubusercontent.com/IvoryCanvas/qamap/main/schema/qamap.schema.json",
|
|
4
|
+
"title": "QAMap configuration",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {
|
|
9
|
+
"type": "string"
|
|
10
|
+
},
|
|
11
|
+
"failOn": {
|
|
12
|
+
"$ref": "#/$defs/severity",
|
|
13
|
+
"description": "Exit with code 1 when findings at this severity or higher are present."
|
|
14
|
+
},
|
|
15
|
+
"ignoreRules": {
|
|
16
|
+
"type": "array",
|
|
17
|
+
"description": "Rule ids to suppress for this repository.",
|
|
18
|
+
"items": {
|
|
19
|
+
"$ref": "#/$defs/ruleId"
|
|
20
|
+
},
|
|
21
|
+
"uniqueItems": true
|
|
22
|
+
},
|
|
23
|
+
"maxFiles": {
|
|
24
|
+
"type": "integer",
|
|
25
|
+
"description": "Maximum number of repository files QAMap will inspect.",
|
|
26
|
+
"minimum": 1
|
|
27
|
+
},
|
|
28
|
+
"severity": {
|
|
29
|
+
"type": "object",
|
|
30
|
+
"description": "Rule-specific severity overrides.",
|
|
31
|
+
"additionalProperties": {
|
|
32
|
+
"$ref": "#/$defs/severity"
|
|
33
|
+
},
|
|
34
|
+
"propertyNames": {
|
|
35
|
+
"$ref": "#/$defs/ruleId"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"validationCommands": {
|
|
39
|
+
"type": "array",
|
|
40
|
+
"description": "Project-specific validation commands to show in test-plan, eval, verify, and GitHub Action reports.",
|
|
41
|
+
"items": {
|
|
42
|
+
"type": "string",
|
|
43
|
+
"minLength": 1
|
|
44
|
+
},
|
|
45
|
+
"uniqueItems": true
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"$defs": {
|
|
49
|
+
"ruleId": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"pattern": "^CW[0-9]{3}$"
|
|
52
|
+
},
|
|
53
|
+
"severity": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"enum": ["info", "low", "medium", "high"]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qamap-pr-qa
|
|
3
|
+
description: Local-first PR QA workflow for AI-assisted code changes. Use when an agent is preparing, updating, or reviewing a pull request and needs to run QAMap to identify affected flows, recommended E2E or manual QA work, missing fixture/selector/assertion/runner evidence, PR checklist items, and optional manifest repair guidance without calling a cloud service or LLM.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# QAMap PR QA
|
|
7
|
+
|
|
8
|
+
Use QAMap as a final local QA pass before presenting a pull request for human review.
|
|
9
|
+
|
|
10
|
+
## Workflow
|
|
11
|
+
|
|
12
|
+
1. Detect the comparison base.
|
|
13
|
+
- Prefer the target PR base branch when known.
|
|
14
|
+
- Otherwise use `origin/main`, then `origin/master`, then the repository default branch.
|
|
15
|
+
2. Run QAMap from the repository root. Prefer the compact agent format — it carries the same decision content as the markdown report in a fraction of the tokens:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
pnpm dlx @ivorycanvas/qamap qa . --base <base> --head HEAD --format agent
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
For an installed project, prefer:
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
pnpm exec qamap qa . --base <base> --head HEAD --format agent
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Drop `--format agent` when a human will read the output directly; the default markdown report is written for people.
|
|
28
|
+
|
|
29
|
+
3. If the repository is a monorepo and the changed files are clearly inside one package, run a scoped pass too:
|
|
30
|
+
|
|
31
|
+
```sh
|
|
32
|
+
pnpm dlx @ivorycanvas/qamap qa <package-path> --workspace-root . --base <base> --head HEAD
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
4. If QAMap prints `First E2E Draft Bootstrap`, treat it as an instruction to create the starter draft before writing broad QA notes:
|
|
36
|
+
|
|
37
|
+
```sh
|
|
38
|
+
pnpm exec qamap e2e setup . --runner <runner>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Use the exact create command from the output when it differs.
|
|
42
|
+
5. Read the output. In agent format (single minified JSON object, `schema.name` = `qamap.qa`):
|
|
43
|
+
- `flows[]` — affected flows with `draft` path, `runnable` status, `entry` route, capped `steps` and `selectors`.
|
|
44
|
+
- `requiredEvidence[]` — evidence that must exist before the PR can be trusted; `recommendedEvidenceCount` for the rest.
|
|
45
|
+
- `requiredBootstrap[]` — setup steps that block trusting generated drafts.
|
|
46
|
+
- `firstDraftCommand` — present only when the repo has no test suite; run it to create the first starter draft.
|
|
47
|
+
- `prChecklist[]` and `commands[]` — checklist lines and validation commands for the handoff.
|
|
48
|
+
In markdown format, read the `PR Comment Draft`, `Missing Evidence Before Trusting This PR`, and `PR Checklist` sections.
|
|
49
|
+
6. Include the useful parts in the PR body, review note, or handoff summary.
|
|
50
|
+
|
|
51
|
+
## Output Rules
|
|
52
|
+
|
|
53
|
+
- Treat QAMap output as QA planning evidence, not proof that browser, device, API, or manual QA passed.
|
|
54
|
+
- Preserve the affected flow, suggested E2E/checklist path, missing evidence, and validation command in the handoff.
|
|
55
|
+
- Prefer creating the suggested starter E2E draft over only reporting that a draft is needed.
|
|
56
|
+
- If QAMap recommends Playwright, Maestro, or manual QA, do not force a different runner unless the repository already has stronger runner evidence.
|
|
57
|
+
- If the output is `review only` or `near runnable`, explain what blocks it from becoming trusted regression evidence.
|
|
58
|
+
- If `qamap qa` says no manifest was found, do not stop. The first run is allowed to be manifest-free.
|
|
59
|
+
|
|
60
|
+
## Manifest Repair
|
|
61
|
+
|
|
62
|
+
When the recommendation is wrong or too broad, do not repeatedly re-prompt for the same QA context. Ask the maintainer which domain, flow, anchor, or check should be corrected.
|
|
63
|
+
|
|
64
|
+
If the team accepts QAMap for ongoing use, suggest this follow-up:
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
pnpm exec qamap manifest init .
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Then humans should review `.qamap/manifest.yaml` and keep only durable team QA language.
|
|
71
|
+
|
|
72
|
+
## Handoff Template
|
|
73
|
+
|
|
74
|
+
```txt
|
|
75
|
+
QAMap QA
|
|
76
|
+
- Affected flow:
|
|
77
|
+
- Suggested E2E/checklist:
|
|
78
|
+
- Missing evidence:
|
|
79
|
+
- Validation command:
|
|
80
|
+
- Manifest repair needed:
|
|
81
|
+
```
|