@hiver/skills 1.0.7 → 1.0.9

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.
Files changed (69) hide show
  1. package/README.md +1 -1
  2. package/collections/common/skills/discuss-problem/SKILL.md +4 -0
  3. package/collections/extension/agents/build-feature.md +2 -1
  4. package/collections/extension/agents/build-milestone.md +2 -1
  5. package/collections/extension/skills/build-component/SKILL.md +75 -1
  6. package/collections/extension/skills/build-component/palette/colors.md +76 -0
  7. package/collections/extension/skills/build-component/references/v2-components.md +100 -0
  8. package/collections/extension/skills/build-component/references/v2-usage-examples.md +23 -0
  9. package/collections/extension/skills/build-component/typography/variants.md +27 -14
  10. package/collections/mobile/skills/version-bump-up/SKILL.md +66 -0
  11. package/collections/qa-skills/README.md +103 -0
  12. package/collections/qa-skills/qa-suite-guide.html +760 -0
  13. package/collections/qa-skills/skills/hiver-explore/SKILL.md +413 -0
  14. package/collections/qa-skills/skills/hiver-explore/references/spec-template.md +204 -0
  15. package/collections/qa-skills/skills/playwright-gen/SKILL.md +280 -0
  16. package/collections/qa-skills/skills/playwright-gen/references/codegen-conventions.md +100 -0
  17. package/collections/qa-skills/skills/playwright-gen/references/step-mapping.md +137 -0
  18. package/collections/qa-skills/skills/qa-api-author/SKILL.md +204 -0
  19. package/collections/qa-skills/skills/qa-api-author/references/api-areas.md +112 -0
  20. package/collections/qa-skills/skills/qa-api-run/SKILL.md +178 -0
  21. package/collections/qa-skills/skills/qa-bugs/SKILL.md +82 -0
  22. package/collections/qa-skills/skills/qa-eval/SKILL.md +123 -0
  23. package/collections/qa-skills/skills/qa-eval/references/deterministic-checks.md +89 -0
  24. package/collections/qa-skills/skills/qa-kit/SKILL.md +228 -0
  25. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/INDEX.md +31 -0
  26. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/INDEX.md +90 -0
  27. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/account-security.md +44 -0
  28. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/apps-integrations.md +43 -0
  29. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/automate-workflows.md +65 -0
  30. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/collaborate.md +36 -0
  31. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/customer-relationships.md +20 -0
  32. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/getting-started.md +31 -0
  33. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/hiver-ai.md +79 -0
  34. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/multichannel-support.md +82 -0
  35. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/reporting-analytics.md +35 -0
  36. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/self-service.md +23 -0
  37. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/sla-policies.md +30 -0
  38. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/hig/troubleshooting.md +27 -0
  39. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/INDEX.md +45 -0
  40. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/account-security.md +13 -0
  41. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/apps-integrations.md +15 -0
  42. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/automate-workflows.md +26 -0
  43. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/collaborate.md +11 -0
  44. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/customer-relationships.md +9 -0
  45. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/getting-started.md +21 -0
  46. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/hiver-ai.md +13 -0
  47. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/identity-access.md +23 -0
  48. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/multichannel-support.md +47 -0
  49. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/reporting-analytics.md +13 -0
  50. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/self-service.md +11 -0
  51. package/collections/qa-skills/skills/qa-kit/knowledge-base/hiver/omni/sla-policies.md +12 -0
  52. package/collections/qa-skills/skills/qa-kit/references/clickup-ticket.md +163 -0
  53. package/collections/qa-skills/skills/qa-kit/references/eval.md +117 -0
  54. package/collections/qa-skills/skills/qa-kit/references/flow-capture.md +147 -0
  55. package/collections/qa-skills/skills/qa-kit/references/handoff-contract.md +159 -0
  56. package/collections/qa-skills/skills/qa-kit/references/hiver-context.md +99 -0
  57. package/collections/qa-skills/skills/qa-kit/references/tracker-format.md +123 -0
  58. package/collections/qa-skills/skills/qa-kit/references/triage-guide.md +105 -0
  59. package/collections/qa-skills/skills/qa-ui-author/SKILL.md +208 -0
  60. package/collections/qa-skills/skills/qa-ui-author/references/test-areas.md +132 -0
  61. package/collections/qa-skills/skills/qa-ui-run/SKILL.md +183 -0
  62. package/collections/web/agents/build-feature.md +2 -2
  63. package/collections/web/agents/build-milestone.md +2 -2
  64. package/collections/web/skills/build-component/SKILL.md +54 -13
  65. package/collections/web/skills/build-component/palette/colors.md +76 -0
  66. package/collections/web/skills/build-component/references/v2-components.md +100 -0
  67. package/collections/web/skills/build-component/references/v2-usage-examples.md +23 -0
  68. package/collections/web/skills/build-component/typography/variants.md +27 -14
  69. package/package.json +1 -1
@@ -0,0 +1,760 @@
1
+ <title>QA to release in one conversation — the Hiver qa-suite</title>
2
+ <style>
3
+ :root {
4
+ --bg: #f5f7f9;
5
+ --surface: #ffffff;
6
+ --surface-2: #eef1f5;
7
+ --ink: #12151c;
8
+ --muted: #59616f;
9
+ --faint: #8b93a1;
10
+ --line: #e2e6ec;
11
+ --line-strong: #cbd2dc;
12
+ --accent: #2f5fe0;
13
+ --accent-ink: #1e46b6;
14
+ --accent-wash: #eaf0fe;
15
+ --pass: #17915a;
16
+ --fail: #d24141;
17
+ --warn: #b9791a;
18
+ --skip: #7f8895;
19
+ --pass-wash: #e6f4ec;
20
+ --fail-wash: #fbeaea;
21
+ --warn-wash: #f8f0e0;
22
+
23
+ --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, "Helvetica Neue", Arial, sans-serif;
24
+ --mono: ui-monospace, "SF Mono", "JetBrains Mono", "Cascadia Code", Menlo, Consolas, monospace;
25
+
26
+ --maxw: 940px;
27
+ --radius: 12px;
28
+ --shadow: 0 1px 2px rgba(16,21,28,.04), 0 6px 20px rgba(16,21,28,.06);
29
+ }
30
+ @media (prefers-color-scheme: dark) {
31
+ :root {
32
+ --bg: #0c0e13;
33
+ --surface: #14171e;
34
+ --surface-2: #1b1f29;
35
+ --ink: #e9ecf2;
36
+ --muted: #9aa3b2;
37
+ --faint: #69727f;
38
+ --line: #262b35;
39
+ --line-strong: #333a46;
40
+ --accent: #6f9bff;
41
+ --accent-ink: #a6c1ff;
42
+ --accent-wash: #172236;
43
+ --pass: #40c185;
44
+ --fail: #f1685f;
45
+ --warn: #e2a541;
46
+ --skip: #7f8896;
47
+ --pass-wash: #12241b;
48
+ --fail-wash: #2a1616;
49
+ --warn-wash: #271f11;
50
+ }
51
+ }
52
+ :root[data-theme="dark"] {
53
+ --bg: #0c0e13; --surface: #14171e; --surface-2: #1b1f29; --ink: #e9ecf2;
54
+ --muted: #9aa3b2; --faint: #69727f; --line: #262b35; --line-strong: #333a46;
55
+ --accent: #6f9bff; --accent-ink: #a6c1ff; --accent-wash: #172236;
56
+ --pass: #40c185; --fail: #f1685f; --warn: #e2a541; --skip: #7f8896;
57
+ --pass-wash: #12241b; --fail-wash: #2a1616; --warn-wash: #271f11;
58
+ }
59
+ :root[data-theme="light"] {
60
+ --bg: #f5f7f9; --surface: #ffffff; --surface-2: #eef1f5; --ink: #12151c;
61
+ --muted: #59616f; --faint: #8b93a1; --line: #e2e6ec; --line-strong: #cbd2dc;
62
+ --accent: #2f5fe0; --accent-ink: #1e46b6; --accent-wash: #eaf0fe;
63
+ --pass: #17915a; --fail: #d24141; --warn: #b9791a; --skip: #7f8895;
64
+ --pass-wash: #e6f4ec; --fail-wash: #fbeaea; --warn-wash: #f8f0e0;
65
+ }
66
+
67
+ * { box-sizing: border-box; }
68
+ body {
69
+ margin: 0; background: var(--bg); color: var(--ink);
70
+ font-family: var(--sans); line-height: 1.6;
71
+ -webkit-font-smoothing: antialiased; font-size: 17px;
72
+ }
73
+ .wrap { max-width: var(--maxw); margin: 0 auto; padding: 0 24px; }
74
+
75
+ a { color: var(--accent-ink); text-decoration: none; border-bottom: 1px solid color-mix(in srgb, var(--accent) 35%, transparent); }
76
+ a:hover { border-bottom-color: var(--accent); }
77
+
78
+ code, .mono { font-family: var(--mono); font-size: .88em; }
79
+ :not(pre) > code {
80
+ background: var(--surface-2); border: 1px solid var(--line);
81
+ padding: .08em .38em; border-radius: 5px; color: var(--ink);
82
+ white-space: nowrap;
83
+ }
84
+
85
+ h1, h2, h3 { line-height: 1.15; text-wrap: balance; letter-spacing: -.02em; font-weight: 800; }
86
+
87
+ /* ---------- top bar ---------- */
88
+ .topbar {
89
+ position: sticky; top: 0; z-index: 20;
90
+ background: color-mix(in srgb, var(--bg) 86%, transparent);
91
+ backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px);
92
+ border-bottom: 1px solid var(--line);
93
+ }
94
+ .topbar .wrap { display: flex; align-items: center; gap: 14px; height: 56px; }
95
+ .brand { font-family: var(--mono); font-weight: 600; font-size: 14px; letter-spacing: -.01em; display: flex; align-items: center; gap: 9px; }
96
+ .brand .dot { width: 9px; height: 9px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 0 4px var(--accent-wash); }
97
+ .brand b { color: var(--accent-ink); font-weight: 700; }
98
+ .topbar .cmd { margin-left: auto; font-family: var(--mono); font-size: 13px; color: var(--muted); }
99
+ .topbar .cmd b { color: var(--ink); }
100
+
101
+ /* ---------- hero ---------- */
102
+ .hero { padding: 68px 0 44px; border-bottom: 1px solid var(--line); }
103
+ .eyebrow {
104
+ font-family: var(--mono); font-size: 12.5px; letter-spacing: .14em; text-transform: uppercase;
105
+ color: var(--accent-ink); font-weight: 600; margin: 0 0 18px;
106
+ }
107
+ .hero h1 { font-size: clamp(34px, 6vw, 58px); margin: 0 0 20px; }
108
+ .hero h1 .fade { color: var(--muted); }
109
+ .hero .lede { font-size: clamp(18px, 2.4vw, 21px); color: var(--muted); max-width: 62ch; margin: 0 0 30px; }
110
+ .startline {
111
+ display: inline-flex; align-items: center; gap: 12px; flex-wrap: wrap;
112
+ background: var(--surface); border: 1px solid var(--line); border-radius: 999px;
113
+ padding: 9px 9px 9px 20px; box-shadow: var(--shadow);
114
+ }
115
+ .startline .label { font-size: 14px; color: var(--muted); }
116
+ .startline .chip {
117
+ font-family: var(--mono); font-weight: 600; font-size: 15px; color: #fff;
118
+ background: var(--accent); padding: 8px 16px; border-radius: 999px; letter-spacing: -.01em;
119
+ }
120
+ .stats { display: grid; grid-template-columns: repeat(4, 1fr); gap: 1px; background: var(--line);
121
+ border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; margin-top: 40px; }
122
+ .stat { background: var(--surface); padding: 20px 18px; }
123
+ .stat .n { font-family: var(--mono); font-weight: 700; font-size: 27px; color: var(--accent-ink); letter-spacing: -.03em; }
124
+ .stat .k { font-size: 13.5px; color: var(--muted); margin-top: 4px; }
125
+
126
+ /* ---------- generic section ---------- */
127
+ section { padding: 56px 0; border-bottom: 1px solid var(--line); }
128
+ .sec-eyebrow { font-family: var(--mono); font-size: 12px; letter-spacing: .16em; text-transform: uppercase; color: var(--faint); font-weight: 600; margin: 0 0 12px; }
129
+ section h2 { font-size: clamp(25px, 3.6vw, 33px); margin: 0 0 16px; }
130
+ section > .wrap > p { color: var(--muted); max-width: 68ch; }
131
+ section > .wrap > p strong, li strong { color: var(--ink); font-weight: 650; }
132
+
133
+ /* ---------- callout ---------- */
134
+ .note {
135
+ border-left: 3px solid var(--accent); background: var(--accent-wash);
136
+ padding: 16px 20px; border-radius: 0 10px 10px 0; margin: 26px 0; color: var(--ink);
137
+ }
138
+ .note.warnbox { border-left-color: var(--warn); background: var(--warn-wash); }
139
+ .note .tag { font-family: var(--mono); font-size: 11.5px; letter-spacing: .12em; text-transform: uppercase; font-weight: 700; color: var(--accent-ink); display: block; margin-bottom: 6px; }
140
+ .note.warnbox .tag { color: var(--warn); }
141
+ .note p { margin: 0; font-size: 15.5px; color: var(--muted); }
142
+ .note p + p { margin-top: 8px; }
143
+
144
+ /* ---------- spine diagram ---------- */
145
+ .spine { position: relative; margin: 8px 0 0; padding-left: 4px; }
146
+ .spine::before {
147
+ content: ""; position: absolute; left: 21px; top: 12px; bottom: 12px; width: 2px;
148
+ background: linear-gradient(var(--accent), color-mix(in srgb, var(--accent) 30%, var(--line)));
149
+ }
150
+ .station { position: relative; padding: 0 0 22px 62px; }
151
+ .station:last-child { padding-bottom: 0; }
152
+ .station .node {
153
+ position: absolute; left: 10px; top: 2px; width: 24px; height: 24px; border-radius: 50%;
154
+ background: var(--surface); border: 2px solid var(--accent); display: grid; place-items: center;
155
+ font-family: var(--mono); font-size: 11px; font-weight: 700; color: var(--accent-ink); z-index: 1;
156
+ }
157
+ .station.human .node { border-color: var(--warn); color: var(--warn); }
158
+ .station.human::after { }
159
+ .station .card {
160
+ background: var(--surface); border: 1px solid var(--line); border-radius: 11px; padding: 15px 17px;
161
+ box-shadow: var(--shadow);
162
+ }
163
+ .station .card.branch { border-style: dashed; }
164
+ .station .row1 { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
165
+ .station .skill { font-family: var(--mono); font-weight: 700; font-size: 15px; color: var(--ink); }
166
+ .station .kind { font-family: var(--mono); font-size: 11px; letter-spacing: .08em; text-transform: uppercase;
167
+ padding: 2px 8px; border-radius: 999px; border: 1px solid var(--line-strong); color: var(--muted); }
168
+ .station .kind.auto { color: var(--accent-ink); border-color: color-mix(in srgb, var(--accent) 45%, transparent); background: var(--accent-wash); }
169
+ .station .kind.man { color: var(--warn); border-color: color-mix(in srgb, var(--warn) 45%, transparent); background: var(--warn-wash); }
170
+ .station .desc { color: var(--muted); font-size: 15px; margin-top: 6px; }
171
+ .station .desc b { color: var(--ink); font-weight: 620; }
172
+
173
+ .legend-inline { display: flex; gap: 18px; flex-wrap: wrap; margin: 22px 0 4px; font-size: 13.5px; color: var(--muted); }
174
+ .legend-inline span { display: inline-flex; align-items: center; gap: 7px; }
175
+ .swatch { width: 13px; height: 13px; border-radius: 4px; border: 2px solid var(--accent); }
176
+ .swatch.man { border-color: var(--warn); }
177
+
178
+ /* ---------- run dir tree ---------- */
179
+ .tree {
180
+ background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
181
+ padding: 20px 22px; overflow-x: auto; box-shadow: var(--shadow); margin: 24px 0 0;
182
+ }
183
+ .tree pre { margin: 0; font-family: var(--mono); font-size: 13px; line-height: 1.75; color: var(--muted); }
184
+ .tree pre b { color: var(--ink); font-weight: 600; }
185
+ .tree pre .c { color: var(--faint); }
186
+ .tree pre .a { color: var(--accent-ink); }
187
+
188
+ /* ---------- station deep-dive grid ---------- */
189
+ .agent {
190
+ background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
191
+ padding: 22px 24px; margin: 18px 0; box-shadow: var(--shadow);
192
+ }
193
+ .agent > header { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 4px; }
194
+ .agent .id { font-family: var(--mono); font-weight: 700; font-size: 18px; color: var(--ink); letter-spacing: -.01em; }
195
+ .agent .tagline { color: var(--muted); font-size: 15px; margin: 6px 0 16px; }
196
+ .io { display: grid; grid-template-columns: 1fr 1fr; gap: 1px; background: var(--line); border: 1px solid var(--line); border-radius: 9px; overflow: hidden; }
197
+ .io > div { background: var(--surface-2); padding: 12px 15px; }
198
+ .io .h { font-family: var(--mono); font-size: 11px; letter-spacing: .12em; text-transform: uppercase; color: var(--faint); font-weight: 700; margin-bottom: 6px; }
199
+ .io .b { font-size: 14px; color: var(--muted); }
200
+ .io .b code { font-size: .85em; }
201
+ .agent .meta { margin-top: 14px; font-size: 14px; color: var(--muted); display: flex; flex-direction: column; gap: 7px; }
202
+ .agent .meta b { color: var(--ink); font-weight: 620; font-family: var(--mono); font-size: 12.5px; letter-spacing: .04em; }
203
+
204
+ .grouphdr { display: flex; align-items: center; gap: 14px; margin: 40px 0 4px; }
205
+ .grouphdr .n { font-family: var(--mono); font-size: 13px; font-weight: 700; color: #fff; background: var(--accent);
206
+ width: 28px; height: 28px; border-radius: 8px; display: grid; place-items: center; flex: none; }
207
+ .grouphdr h3 { font-size: 20px; margin: 0; }
208
+ .grouphdr.man .n { background: var(--warn); }
209
+
210
+ /* ---------- signals ---------- */
211
+ .signals { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; margin-top: 8px; }
212
+ .sig { display: flex; gap: 13px; align-items: flex-start; background: var(--surface); border: 1px solid var(--line);
213
+ border-radius: 10px; padding: 14px 16px; }
214
+ .sig .mark { font-size: 20px; line-height: 1; flex: none; margin-top: 1px; }
215
+ .sig .t { font-weight: 700; font-size: 15px; }
216
+ .sig .d { font-size: 13.5px; color: var(--muted); margin-top: 2px; }
217
+ .sig.pass { border-left: 3px solid var(--pass); }
218
+ .sig.fail { border-left: 3px solid var(--fail); }
219
+ .sig.warn { border-left: 3px solid var(--warn); }
220
+ .sig.skip { border-left: 3px solid var(--skip); }
221
+
222
+ /* ---------- tables ---------- */
223
+ .tablewrap { overflow-x: auto; border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); margin-top: 8px; }
224
+ table { border-collapse: collapse; width: 100%; font-size: 14.5px; min-width: 560px; }
225
+ th, td { text-align: left; padding: 12px 15px; border-bottom: 1px solid var(--line); vertical-align: top; }
226
+ thead th { background: var(--surface-2); font-size: 12px; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); font-weight: 700; }
227
+ tbody tr:last-child td { border-bottom: none; }
228
+ tbody tr { background: var(--surface); }
229
+ td .mono, th .mono { color: var(--accent-ink); font-weight: 600; }
230
+ td.owner { font-family: var(--mono); font-size: 12.5px; color: var(--accent-ink); font-weight: 600; }
231
+
232
+ /* ---------- ordered steps (day in the life) ---------- */
233
+ ol.walk { counter-reset: step; list-style: none; padding: 0; margin: 8px 0 0; }
234
+ ol.walk li { position: relative; padding: 4px 0 20px 46px; border-left: 2px solid var(--line); margin-left: 13px; }
235
+ ol.walk li:last-child { border-left-color: transparent; padding-bottom: 0; }
236
+ ol.walk li::before {
237
+ counter-increment: step; content: counter(step);
238
+ position: absolute; left: -14px; top: 0; width: 26px; height: 26px; border-radius: 50%;
239
+ background: var(--surface); border: 2px solid var(--accent); color: var(--accent-ink);
240
+ font-family: var(--mono); font-weight: 700; font-size: 12px; display: grid; place-items: center;
241
+ }
242
+ ol.walk li b { color: var(--ink); }
243
+ ol.walk li .who { font-family: var(--mono); font-size: 12px; color: var(--accent-ink); }
244
+ ol.walk li.human::before { border-color: var(--warn); color: var(--warn); }
245
+ ol.walk li.human .who { color: var(--warn); }
246
+
247
+ /* ---------- install ---------- */
248
+ .terminal { background: #0c0e13; border: 1px solid var(--line-strong); border-radius: var(--radius); overflow: hidden; margin-top: 8px; box-shadow: var(--shadow); }
249
+ .terminal .bar { display: flex; gap: 7px; padding: 12px 15px; border-bottom: 1px solid #23272f; }
250
+ .terminal .bar i { width: 11px; height: 11px; border-radius: 50%; display: block; }
251
+ .terminal .bar i:nth-child(1){ background:#ff5f57;} .terminal .bar i:nth-child(2){ background:#febc2e;} .terminal .bar i:nth-child(3){ background:#28c840;}
252
+ .terminal pre { margin: 0; padding: 18px 20px; font-family: var(--mono); font-size: 13.5px; line-height: 1.9; color: #cfd6e0; overflow-x: auto; }
253
+ .terminal pre .p { color: #6f9bff; }
254
+ .terminal pre .c { color: #6a7382; }
255
+ .terminal pre b { color: #fff; font-weight: 600; }
256
+
257
+ ul.clean { padding-left: 0; list-style: none; margin: 16px 0 0; display: flex; flex-direction: column; gap: 10px; }
258
+ ul.clean li { position: relative; padding-left: 26px; color: var(--muted); font-size: 15.5px; }
259
+ ul.clean li::before { content: ""; position: absolute; left: 4px; top: 11px; width: 7px; height: 7px; border-radius: 2px; background: var(--accent); }
260
+ ul.clean li b { color: var(--ink); font-weight: 620; }
261
+
262
+ footer { padding: 40px 0 60px; color: var(--faint); font-size: 13.5px; }
263
+ footer .wrap { display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap; align-items: center; }
264
+ footer .mono { color: var(--muted); }
265
+
266
+ @media (max-width: 720px) {
267
+ body { font-size: 16px; }
268
+ .stats { grid-template-columns: repeat(2, 1fr); }
269
+ .io { grid-template-columns: 1fr; }
270
+ .signals { grid-template-columns: 1fr; }
271
+ .topbar .cmd { display: none; }
272
+ }
273
+ @media (prefers-reduced-motion: reduce) { * { scroll-behavior: auto; } }
274
+ </style>
275
+
276
+ <header class="topbar">
277
+ <div class="wrap">
278
+ <span class="brand"><span class="dot"></span> qa-suite <b>· Hiver QA</b></span>
279
+ <span class="cmd">start with <b>/qa-kit</b></span>
280
+ </div>
281
+ </header>
282
+
283
+ <div class="hero">
284
+ <div class="wrap">
285
+ <p class="eyebrow">Field guide · for QA engineers &amp; SDETs</p>
286
+ <h1>Take a feature from QA<br><span class="fade">to release in one conversation.</span></h1>
287
+ <p class="lede">
288
+ <code>qa-suite</code> is a team of QA agents that hand work to each other inside a single chat.
289
+ You open with one command; the spec, the test plan, the browser run, the bugs, the release gate,
290
+ and the automation PR all happen in that same thread. This guide shows what runs when — and where
291
+ <em>you</em> take the wheel.
292
+ </p>
293
+ <span class="startline">
294
+ <span class="label">Everything begins by typing</span>
295
+ <span class="chip">/qa-kit</span>
296
+ </span>
297
+
298
+ <div class="stats">
299
+ <div class="stat"><div class="n">1</div><div class="k">conversation, start to ship</div></div>
300
+ <div class="stat"><div class="n">9</div><div class="k">specialist agents on the relay</div></div>
301
+ <div class="stat"><div class="n">2</div><div class="k">test tracks — UI &amp; API</div></div>
302
+ <div class="stat"><div class="n">4</div><div class="k">verdict signals: ✅ ❌ ⚠️ ⏭️</div></div>
303
+ </div>
304
+ </div>
305
+ </div>
306
+
307
+ <!-- ================= BIG IDEA ================= -->
308
+ <section>
309
+ <div class="wrap">
310
+ <p class="sec-eyebrow">The big idea</p>
311
+ <h2>One conversation is one run — and the run remembers everything</h2>
312
+ <p>
313
+ The reason a whole team of agents can relay a feature without ever re-asking you the same
314
+ question twice is a single design decision: <strong>handoffs are files, not chat messages.</strong>
315
+ The first agent to run mints a <em>run directory</em> and drops a pointer to it in
316
+ <code>qa-output/.current-run</code>. Every agent after that reads that pointer, picks up the shared
317
+ <code>handoff.json</code>, does its job, writes its output back into the same folder, and advances
318
+ the baton. The chat is the conversation; the run directory is the memory.
319
+ </p>
320
+
321
+ <div class="tree">
322
+ <pre><span class="c"># the shared memory for a single feature's QA pass</span>
323
+ qa-output/
324
+ <b>.current-run</b> <span class="c"># → points every agent at the active run</span>
325
+ hiver-notes/
326
+ <b>hiver-notes-20260713-1530/</b>
327
+ <span class="a">handoff.json</span> <span class="c"># the baton: who → whom, + all context so far</span>
328
+ <span class="a">tracker.xlsx</span> <span class="c"># the source of truth for cases &amp; pass/fail</span>
329
+ handoffs/<span class="c"> …-to-….json # audit trail, one file per boundary crossed</span>
330
+ steps/<span class="c"> &lt;skill&gt;-&lt;phase&gt;.json # what each agent produced (for the judge)</span>
331
+ logs/<span class="c"> &lt;skill&gt;.jsonl # forensic trace of what each agent did</span>
332
+ screenshots/<span class="c"> # evidence from the browser run</span>
333
+ trace/<span class="c"> report.md # qa-eval's quality verdict, written at the end</span>
334
+ spec.md<span class="c"> # the feature spec (if hiver-explore built one)</span></pre>
335
+ </div>
336
+
337
+ <div class="note">
338
+ <span class="tag">Why this matters to you</span>
339
+ <p>You can walk away mid-run and come back. You can hand the chat to a teammate. The tracker has strict
340
+ <strong>column ownership</strong> — the author agent writes the cases, the run agent writes
341
+ <em>Testing&nbsp;1</em>, <strong>you</strong> own <em>Testing&nbsp;2</em>, and qa-bugs writes the ticket links.
342
+ Nobody overwrites anybody. Every stage is independently re-runnable.</p>
343
+ </div>
344
+ </div>
345
+ </section>
346
+
347
+ <!-- ================= THE MAP ================= -->
348
+ <section>
349
+ <div class="wrap">
350
+ <p class="sec-eyebrow">The map</p>
351
+ <h2>What runs, in order</h2>
352
+ <p>
353
+ <code>/qa-kit</code> is the only thing you have to remember. It gathers your inputs, reads the code
354
+ diff, interviews you, classifies the change, sizes the effort, and drives the relay.
355
+ Here is the spine. Blue stations are agents; amber stations are where a human steps in.
356
+ </p>
357
+
358
+ <div class="legend-inline">
359
+ <span><i class="swatch"></i> agent step (Claude drives)</span>
360
+ <span><i class="swatch man"></i> human step (you drive)</span>
361
+ </div>
362
+
363
+ <div class="spine">
364
+ <div class="station">
365
+ <span class="node">0</span>
366
+ <div class="card">
367
+ <div class="row1"><span class="skill">/qa-kit</span><span class="kind auto">orchestrator</span></div>
368
+ <div class="desc"><b>Front door.</b> Gathers inputs (PR/branch, PRD, Figma), reads the code diff,
369
+ interviews you, classifies the change <b>UI / API / new-API / mixed</b>, sizes the effort, and routes.</div>
370
+ </div>
371
+ </div>
372
+ <div class="station">
373
+ <span class="node">↑</span>
374
+ <div class="card branch">
375
+ <div class="row1"><span class="skill">hiver-explore</span><span class="kind auto">feeder · only if no spec</span></div>
376
+ <div class="desc">No PRD? It reads help.hiverhq.com, drives the live feature, and writes a Confluence-style
377
+ <code>spec.md</code> — then hands back to qa-kit.</div>
378
+ </div>
379
+ </div>
380
+ <div class="station">
381
+ <span class="node">1</span>
382
+ <div class="card">
383
+ <div class="row1"><span class="skill">qa-ui-author</span><span class="kind auto">authoring</span>
384
+ <span class="mono" style="color:var(--faint);font-size:12px">/ qa-api-author</span></div>
385
+ <div class="desc">Turns the spec into a <b>Word test plan + the Excel tracker</b>. No browser yet — just cases.</div>
386
+ </div>
387
+ </div>
388
+ <div class="station">
389
+ <span class="node">2</span>
390
+ <div class="card">
391
+ <div class="row1"><span class="skill">qa-ui-run</span><span class="kind auto">round 1</span>
392
+ <span class="mono" style="color:var(--faint);font-size:12px">/ qa-api-run</span></div>
393
+ <div class="desc"><b>The browser first pass.</b> Connects to your logged-in Chrome tab and runs every
394
+ testable case, recording ✅ ❌ ⚠️ ⏭️ + screenshots into the tracker.</div>
395
+ </div>
396
+ </div>
397
+ <div class="station">
398
+ <span class="node">3</span>
399
+ <div class="card">
400
+ <div class="row1"><span class="skill">qa-bugs</span><span class="kind auto">bug sink</span></div>
401
+ <div class="desc">Every confirmed ❌/⚠️ becomes a <b>ClickUp ticket</b> — repro, expected, actual, evidence attached.</div>
402
+ </div>
403
+ </div>
404
+ <div class="station human">
405
+ <span class="node">▲</span>
406
+ <div class="card">
407
+ <div class="row1"><span class="skill">you — manual QA</span><span class="kind man">human takes over</span></div>
408
+ <div class="desc">Pick up the <b>⏭️ skipped</b> cases (credentials, multi-account, backend-failure) into the
409
+ <em>Testing 2</em> column, and do the <b>exploratory testing</b> only a human can — edge cases, odd states, "what if I…".</div>
410
+ </div>
411
+ </div>
412
+ <div class="station human">
413
+ <span class="node">◆</span>
414
+ <div class="card">
415
+ <div class="row1"><span class="skill">release gate</span><span class="kind man">you + LaunchDarkly</span></div>
416
+ <div class="desc">Signed off? In the <b>same chat</b>, connect the LaunchDarkly MCP (or paste the flag JSON) to update
417
+ the enrolment list and <b>control the rollout</b> account by account.</div>
418
+ </div>
419
+ </div>
420
+ <div class="station">
421
+ <span class="node">4</span>
422
+ <div class="card">
423
+ <div class="row1"><span class="skill">playwright-gen</span><span class="kind auto">automation</span></div>
424
+ <div class="desc">Turns the <b>passing</b> cases into real, runnable <code>.spec.ts</code>, runs them, writes results
425
+ back, and opens the <b>automation PR</b> for an SDET to pull.</div>
426
+ </div>
427
+ </div>
428
+ <div class="station">
429
+ <span class="node">✓</span>
430
+ <div class="card">
431
+ <div class="row1"><span class="skill">qa-eval</span><span class="kind auto">independent judge</span></div>
432
+ <div class="desc">Runs automatically at the end. Grades every agent's output <b>PASS / DEGRADED / FAIL</b>
433
+ and writes <code>trace/report.md</code>. Warns; never blocks.</div>
434
+ </div>
435
+ </div>
436
+ </div>
437
+
438
+ <div class="note">
439
+ <span class="tag">Mixed changes get both tracks</span>
440
+ <p>When a change touches both surfaces, qa-kit runs the UI and API tracks against the
441
+ <strong>same run directory and the same tracker</strong> (UI vs API column blocks) — so one feature
442
+ still means one conversation and one source of truth.</p>
443
+ </div>
444
+ </div>
445
+ </section>
446
+
447
+ <!-- ================= DEEP DIVE ================= -->
448
+ <section>
449
+ <div class="wrap">
450
+ <p class="sec-eyebrow">Station by station</p>
451
+ <h2>Every agent — what it needs, what it leaves behind, who calls it</h2>
452
+ <p>You rarely invoke these by name — qa-kit routes to them and they chain to each other. But knowing each
453
+ one's job tells you exactly where to intervene.</p>
454
+
455
+ <!-- FRONT DOOR -->
456
+ <div class="grouphdr"><span class="n">A</span><h3>The front door &amp; the feeder</h3></div>
457
+
458
+ <div class="agent">
459
+ <header><span class="id">qa-kit</span><span class="kind auto" style="font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;padding:2px 8px;border-radius:999px;border:1px solid;">orchestrator</span></header>
460
+ <div class="tagline">The single command you actually type. Triages and routes — it never writes cases itself.</div>
461
+ <div class="io">
462
+ <div><div class="h">Reads</div><div class="b">PR/branch diff (<code>gh pr diff</code>), PRD via Atlassian MCP <em>or</em> pasted text, Figma link, your interview answers</div></div>
463
+ <div><div class="h">Writes</div><div class="b">Triage Summary + <code>handoff.json</code> with classification, product (HIG/Omni/Both) &amp; effort</div></div>
464
+ </div>
465
+ <div class="meta">
466
+ <span><b>DECIDES</b> UI · API · new-API · mixed → which track(s) run</span>
467
+ <span><b>SIZES IT</b> smoke · standard · exhaustive</span>
468
+ <span><b>YOU CONFIRM</b> the classification &amp; effort before it routes</span>
469
+ </div>
470
+ </div>
471
+
472
+ <div class="agent">
473
+ <header><span class="id">hiver-explore</span></header>
474
+ <div class="tagline">The upstream feeder — only runs when there's no spec to work from.</div>
475
+ <div class="io">
476
+ <div><div class="h">Reads</div><div class="b">help.hiverhq.com docs + the live feature in your Chrome session</div></div>
477
+ <div><div class="h">Writes</div><div class="b">A Confluence-style <code>spec.md</code> (user stories, rules, edge cases, live selectors &amp; quirks)</div></div>
478
+ </div>
479
+ <div class="meta">
480
+ <span><b>MINTS THE RUN</b> when it starts the chain, then hands to qa-kit</span>
481
+ <span><b>TAGS EVERYTHING</b> [D] from docs · [L] from live UI · [D≠L] discrepancy = a risk</span>
482
+ </div>
483
+ </div>
484
+
485
+ <!-- UI TRACK -->
486
+ <div class="grouphdr"><span class="n">B</span><h3>The UI track</h3></div>
487
+
488
+ <div class="agent">
489
+ <header><span class="id">qa-ui-author</span></header>
490
+ <div class="tagline">Turns the spec into paper: a Word test plan and the Excel tracker. No browser.</div>
491
+ <div class="io">
492
+ <div><div class="h">Reads</div><div class="b"><code>handoff.json</code> → spec, product, effort, Figma, risks</div></div>
493
+ <div><div class="h">Writes</div><div class="b"><code>TestPlan_*.docx</code> + <code>tracker.xlsx</code> (it owns the case columns)</div></div>
494
+ </div>
495
+ <div class="meta">
496
+ <span><b>ONE BATCH</b> of clarifying questions for you to take to PM/dev</span>
497
+ <span><b>EFFORT SIZES IT</b> smoke ≈ 8–12 · standard ≈ 20–40 · exhaustive = full coverage</span>
498
+ </div>
499
+ </div>
500
+
501
+ <div class="agent">
502
+ <header><span class="id">qa-ui-run</span></header>
503
+ <div class="tagline">Round 1 — the browser first pass. This is the one that drives Hiver in front of you.</div>
504
+ <div class="io">
505
+ <div><div class="h">Reads</div><div class="b">The tracker's cases + product (picks the HIG-in-Gmail or Omni surface)</div></div>
506
+ <div><div class="h">Writes</div><div class="b"><em>Initial Behaviour – Testing 1</em> (✅/❌/⚠️/⏭️) + screenshots for every ❌/⚠️</div></div>
507
+ </div>
508
+ <div class="meta">
509
+ <span><b>CONNECTS TO YOU</b> attaches to your already-logged-in Chrome tab — it never logs in for you</span>
510
+ <span><b>SKIPS &amp; SAYS WHY</b> multi-account, backend-failure sim, credential entry → ⏭️ for a human</span>
511
+ <span><b>OPTIONAL</b> flow-capture records the API traffic behind passing flows for the API track</span>
512
+ </div>
513
+ </div>
514
+
515
+ <!-- API TRACK -->
516
+ <div class="grouphdr"><span class="n">C</span><h3>The API track</h3></div>
517
+
518
+ <div class="agent">
519
+ <header><span class="id">qa-api-author</span></header>
520
+ <div class="tagline">Documents API cases — endpoint, method, auth, payload, expected status/body. No live calls.</div>
521
+ <div class="io">
522
+ <div><div class="h">Reads</div><div class="b">The change's endpoints from the diff/spec (or a captured flow)</div></div>
523
+ <div><div class="h">Writes</div><div class="b">The API column block of the tracker + a light plan</div></div>
524
+ </div>
525
+ <div class="meta"><span><b>SAFE</b> authoring only — it never touches a live environment</span></div>
526
+ </div>
527
+
528
+ <div class="agent">
529
+ <header><span class="id">qa-api-run</span></header>
530
+ <div class="tagline">Executes the API cases against staging — opt-in and safety-gated.</div>
531
+ <div class="io">
532
+ <div><div class="h">Reads</div><div class="b">The tracker's API cases, <em>or</em> a PASS flow recording from flow-capture</div></div>
533
+ <div><div class="h">Writes</div><div class="b">Actual status + body back into the tracker; failures to qa-bugs</div></div>
534
+ </div>
535
+ <div class="meta">
536
+ <span><b>STAGING ONLY</b> never production; destructive calls are gated</span>
537
+ <span><b>RE-AUTHS</b> uses a fresh token — never replays a captured bearer; tokens redacted</span>
538
+ </div>
539
+ </div>
540
+
541
+ <!-- SHARED BUG SINK -->
542
+ <div class="grouphdr"><span class="n">D</span><h3>The shared bug sink</h3></div>
543
+
544
+ <div class="agent">
545
+ <header><span class="id">qa-bugs</span></header>
546
+ <div class="tagline">The one place bug tickets are born, so UI and API bugs look identical.</div>
547
+ <div class="io">
548
+ <div><div class="h">Reads</div><div class="b">The failing cases from <code>handoff.json</code> (or TC IDs you name)</div></div>
549
+ <div><div class="h">Writes</div><div class="b">One ClickUp ticket per confirmed bug + tracker <em>Status→Bug</em>, <em>Notes→link</em></div></div>
550
+ </div>
551
+ <div class="meta"><span><b>NEVER FILES BLIND</b> no ticket without attached evidence; one bug = one ticket</span></div>
552
+ </div>
553
+
554
+ <!-- AUTOMATION + JUDGE -->
555
+ <div class="grouphdr"><span class="n">E</span><h3>Automation &amp; the judge</h3></div>
556
+
557
+ <div class="agent">
558
+ <header><span class="id">playwright-gen</span></header>
559
+ <div class="tagline">The bridge from confirmed cases to running automated tests + a PR.</div>
560
+ <div class="io">
561
+ <div><div class="h">Reads</div><div class="b">The <b>passing</b>, automatable cases + the poc-playwright repo's existing page objects</div></div>
562
+ <div><div class="h">Writes</div><div class="b"><code>specs/&lt;feature&gt;.spec.ts</code>, runs it, Allure report, results back to tracker, opens the PR</div></div>
563
+ </div>
564
+ <div class="meta">
565
+ <span><b>REUSE, NEVER HALLUCINATE</b> maps steps onto real page-object methods; flags a missing one, never invents a selector</span>
566
+ <span><b>SDET PICKS IT UP</b> ~80–90% expected to pass on a live build; the rest is a human's last mile</span>
567
+ </div>
568
+ </div>
569
+
570
+ <div class="agent">
571
+ <header><span class="id">qa-eval</span></header>
572
+ <div class="tagline">The independent inspector. Reads every step record and grades output quality.</div>
573
+ <div class="io">
574
+ <div><div class="h">Reads</div><div class="b">Every <code>steps/*.json</code> + the artefacts they produced</div></div>
575
+ <div><div class="h">Writes</div><div class="b"><code>trace/report.md</code> — per-agent PASS/DEGRADED/FAIL + where quality first broke</div></div>
576
+ </div>
577
+ <div class="meta">
578
+ <span><b>WARN, NEVER BLOCK</b> a FAIL is a loud flag, not a halt — you decide what to do</span>
579
+ <span><b>INDEPENDENT</b> never trusts an agent's own self-check as the verdict</span>
580
+ </div>
581
+ </div>
582
+ </div>
583
+ </section>
584
+
585
+ <!-- ================= WHERE YOU TAKE OVER ================= -->
586
+ <section>
587
+ <div class="wrap">
588
+ <p class="sec-eyebrow">The human's job</p>
589
+ <h2>Round 1 is Claude's. Round 2 is yours.</h2>
590
+ <p>
591
+ This system is deliberately <strong>not</strong> trying to replace you. The browser first pass clears the
592
+ repetitive, mechanical coverage so your hours go where machines can't. Two things are explicitly handed back:
593
+ </p>
594
+
595
+ <ul class="clean">
596
+ <li><b>The ⏭️ Skipped cases.</b> Anything that needs a real credential typed, two accounts open at once, a
597
+ simulated backend failure, or an OAuth handshake gets marked <em>Skipped — test manually</em> with the reason.
598
+ You run these into the <em>Testing 2</em> column, which is yours alone.</li>
599
+ <li><b>Exploratory testing.</b> While the tracker cases are covered, you go off-script — poke the edges, chase the
600
+ "that's weird…" moments, and find the behaviours no written case predicted. That's the judgment the pipeline
601
+ is buying time for.</li>
602
+ </ul>
603
+
604
+ <div class="note">
605
+ <span class="tag">The division of labour</span>
606
+ <p>Agents own <em>breadth</em> — every documented case, run consistently, evidence attached.
607
+ You own <em>depth</em> — the skipped-by-design cases and the intuition-led exploration. The tracker keeps both
608
+ visible in one sheet.</p>
609
+ </div>
610
+ </div>
611
+ </section>
612
+
613
+ <!-- ================= RELEASE GATE ================= -->
614
+ <section>
615
+ <div class="wrap">
616
+ <p class="sec-eyebrow">The release gate</p>
617
+ <h2>Control the rollout without leaving the chat</h2>
618
+ <p>
619
+ Once manual QA has signed off, the release itself happens in the same conversation. Hiver ships behind
620
+ LaunchDarkly flags, so "releasing" means <strong>updating the enrolment / targeting list</strong> —
621
+ which accounts get the feature, in what order. Two ways to do it:
622
+ </p>
623
+ <div class="io" style="margin-top:18px">
624
+ <div><div class="h">If you connect the LaunchDarkly MCP</div><div class="b">Claude reads the current targeting, you say which accounts to add, and the flag is updated in-thread — a live, auditable rollout control.</div></div>
625
+ <div><div class="h">If you'd rather not connect it</div><div class="b">Paste the flag's JSON. Claude returns an updated enrolment list you can apply yourself. Same control, zero new access granted.</div></div>
626
+ </div>
627
+ <div class="note warnbox">
628
+ <span class="tag">Status — roadmap</span>
629
+ <p>The release gate is a <strong>workflow you run in-chat today</strong> (bring-your-own LaunchDarkly MCP or paste JSON),
630
+ not yet a packaged skill in <code>qa-suite</code>. It's called out here because it belongs in the single-conversation
631
+ story — and a dedicated release-control skill is the natural next addition.</p>
632
+ </div>
633
+ </div>
634
+ </section>
635
+
636
+ <!-- ================= SIGNALS ================= -->
637
+ <section>
638
+ <div class="wrap">
639
+ <p class="sec-eyebrow">Reading the tracker</p>
640
+ <h2>Four signals, one shared vocabulary</h2>
641
+ <p>Every run agent records exactly one of these per case in <em>Testing 1</em>. When you scan a tracker or a
642
+ <code>report.md</code>, this is the whole language:</p>
643
+ <div class="signals">
644
+ <div class="sig pass"><span class="mark">✅</span><div><div class="t">As Expected</div><div class="d">Behaviour matched the case. Candidate for playwright-gen automation.</div></div></div>
645
+ <div class="sig fail"><span class="mark">❌</span><div><div class="t">Different</div><div class="d">Observed state differs from Expected — screenshot captured, headed to qa-bugs.</div></div></div>
646
+ <div class="sig warn"><span class="mark">⚠️</span><div><div class="t">Partial</div><div class="d">Some of the expectation held; the note says which part didn't. Also bug-bound.</div></div></div>
647
+ <div class="sig skip"><span class="mark">⏭️</span><div><div class="t">Skipped</div><div class="d">Can't be done by the browser pass (credentials, multi-account…). Handed to you.</div></div></div>
648
+ </div>
649
+ </div>
650
+ </section>
651
+
652
+ <!-- ================= CONNECTORS ================= -->
653
+ <section>
654
+ <div class="wrap">
655
+ <p class="sec-eyebrow">Plumbing</p>
656
+ <h2>The connectors that make it real</h2>
657
+ <p>The agents lean on MCP connectors for their outside-world reach. Most are optional — the pipeline always has a
658
+ paste-it-in fallback so a missing connector never stalls a run.</p>
659
+ <div class="tablewrap">
660
+ <table>
661
+ <thead><tr><th>Connector</th><th>Used by</th><th>For</th><th>If not connected</th></tr></thead>
662
+ <tbody>
663
+ <tr><td class="owner">Claude in Chrome</td><td>qa-ui-run · hiver-explore</td><td>Driving the live, logged-in Hiver tab (Gmail / Omni)</td><td>Required for the browser pass — you open &amp; connect the tab</td></tr>
664
+ <tr><td class="owner">ClickUp</td><td>qa-bugs</td><td>Filing bug tickets with evidence</td><td>Emits copy-paste ticket blocks instead</td></tr>
665
+ <tr><td class="owner">Atlassian</td><td>qa-kit</td><td>Pulling the Confluence/Jira spec</td><td>You paste the PRD text — first-class path</td></tr>
666
+ <tr><td class="owner">Figma</td><td>qa-kit · qa-ui-author</td><td>UI states &amp; flows the spec misses (triage + case-writing)</td><td>Share the frames, or note 'none'</td></tr>
667
+ <tr><td class="owner">LaunchDarkly</td><td>release gate</td><td>Updating flag targeting / enrolment list</td><td>Paste the flag JSON, apply the result yourself</td></tr>
668
+ </tbody>
669
+ </table>
670
+ </div>
671
+ </div>
672
+ </section>
673
+
674
+ <!-- ================= DAY IN THE LIFE ================= -->
675
+ <section>
676
+ <div class="wrap">
677
+ <p class="sec-eyebrow">A worked example</p>
678
+ <h2>Shipping "Pinned Notes" — one chat, start to finish</h2>
679
+ <ol class="walk">
680
+ <li><b>You type <code>/qa-kit</code></b> and answer "QA engineer". You paste the ClickUp ticket, the PRD link,
681
+ and the Figma frame. <span class="who">qa-kit</span> reads the PR diff, interviews you, and calls it
682
+ <b>UI · standard effort</b>. You confirm.</li>
683
+ <li><span class="who">qa-ui-author</span> writes the test plan and a 26-case tracker, and asks its one batch of
684
+ clarifying questions. You take two of them to the PM, answer, and say go.</li>
685
+ <li><b>You open the Gmail tab</b> with the extension build and the shared mailbox, and hit Connect.
686
+ <span class="who">qa-ui-run</span> drives Hiver through all 26 cases: <b>21 ✅, 3 ❌, 2 ⏭️</b> (both need a second account).</li>
687
+ <li><span class="who">qa-bugs</span> files 3 ClickUp tickets with screenshots and links them in the tracker.</li>
688
+ <li class="human"><b>You take over.</b> You run the 2 skipped multi-account cases by hand into <em>Testing 2</em>,
689
+ then spend 40 minutes exploring — and catch a pin-ordering glitch no case predicted. One more ticket.</li>
690
+ <li class="human"><b>Release gate.</b> Sign-off done, you connect LaunchDarkly and roll "Pinned Notes" out to
691
+ 3 pilot accounts — still in the same chat.</li>
692
+ <li><span class="who">playwright-gen</span> turns the 21 passing cases into <code>specs/pinnedNotes.spec.ts</code>,
693
+ runs them green, and opens the automation PR.</li>
694
+ <li><b>An SDET pulls the branch</b>, runs it locally — 19 pass as-is, 2 need a selector tweak. Merged.
695
+ <span class="who">qa-eval</span> has already written <code>report.md</code>: all stages PASS.</li>
696
+ </ol>
697
+ </div>
698
+ </section>
699
+
700
+ <!-- ================= GETTING STARTED ================= -->
701
+ <section>
702
+ <div class="wrap">
703
+ <p class="sec-eyebrow">Getting started</p>
704
+ <h2>Install once, then just say <code>/qa-kit</code></h2>
705
+ <p><code>qa-suite</code> ships from the internal <b>grexit</b> marketplace. Add it once; it updates itself when the team ships a new version.</p>
706
+ <div class="terminal">
707
+ <div class="bar"><i></i><i></i><i></i></div>
708
+ <pre><span class="c"># 1 — add the internal marketplace (once per machine)</span>
709
+ <span class="p">/plugin</span> marketplace add GrexIt/claude-plugins
710
+
711
+ <span class="c"># 2 — install the QA suite</span>
712
+ <span class="p">/plugin</span> install <b>qa-suite@grexit</b>
713
+ <span class="p">/reload-plugins</span>
714
+
715
+ <span class="c"># 3 — start a QA pass, from anywhere</span>
716
+ <span class="p">/qa-kit</span>
717
+
718
+ <span class="c"># later, to pull the newest version</span>
719
+ <span class="p">/plugin</span> marketplace update grexit</pre>
720
+ </div>
721
+ <div class="note">
722
+ <span class="tag">One prerequisite for the automation step</span>
723
+ <p><code>playwright-gen</code> writes and runs real specs inside the <code>poc-playwright</code>
724
+ (a.k.a. <code>playwright-hig-automation</code>) repo, so that repo needs its one-time setup done
725
+ (<code>npm install</code>, <code>npx playwright install chromium</code>, <code>npm run auth:all</code>).
726
+ Everything before automation runs without it.</p>
727
+ </div>
728
+ </div>
729
+ </section>
730
+
731
+ <!-- ================= QUICK REF ================= -->
732
+ <section>
733
+ <div class="wrap">
734
+ <p class="sec-eyebrow">Quick reference</p>
735
+ <h2>The whole relay on one card</h2>
736
+ <div class="tablewrap">
737
+ <table>
738
+ <thead><tr><th>Agent</th><th>Role</th><th>Who calls it</th><th>Leaves behind</th></tr></thead>
739
+ <tbody>
740
+ <tr><td class="owner">qa-kit</td><td>Orchestrator / front door</td><td>You (<code>/qa-kit</code>)</td><td>Triage + routing</td></tr>
741
+ <tr><td class="owner">hiver-explore</td><td>Spec builder (no-spec path)</td><td>qa-kit, or you</td><td><code>spec.md</code></td></tr>
742
+ <tr><td class="owner">qa-ui-author</td><td>UI test plan + tracker</td><td>qa-kit</td><td>Word plan + tracker</td></tr>
743
+ <tr><td class="owner">qa-ui-run</td><td>Browser first pass (round 1)</td><td>qa-ui-author</td><td>Testing-1 results + screenshots</td></tr>
744
+ <tr><td class="owner">qa-api-author</td><td>API cases (no calls)</td><td>qa-kit</td><td>API tracker block</td></tr>
745
+ <tr><td class="owner">qa-api-run</td><td>API execution vs staging</td><td>qa-api-author / flow-capture</td><td>Status+body results</td></tr>
746
+ <tr><td class="owner">qa-bugs</td><td>Bug → ClickUp ticket</td><td>qa-ui-run / qa-api-run / you</td><td>Tickets + tracker links</td></tr>
747
+ <tr><td class="owner">playwright-gen</td><td>Cases → running specs + PR</td><td>qa-ui-run, or you</td><td>Spec files + Allure + PR</td></tr>
748
+ <tr><td class="owner">qa-eval</td><td>Output-quality judge</td><td>Auto, at pipeline end</td><td><code>trace/report.md</code></td></tr>
749
+ </tbody>
750
+ </table>
751
+ </div>
752
+ </div>
753
+ </section>
754
+
755
+ <footer>
756
+ <div class="wrap">
757
+ <span class="mono">qa-suite · Hiver QA — built at the AI-workflows hackathon</span>
758
+ <span>One command in. A tested, ticketed, automated, released feature out.</span>
759
+ </div>
760
+ </footer>