@aplaytest/core 0.1.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.
Files changed (112) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/config/schema.d.ts +247 -0
  3. package/dist/config/schema.d.ts.map +1 -0
  4. package/dist/config/schema.js +279 -0
  5. package/dist/config/schema.js.map +1 -0
  6. package/dist/evidence/id.d.ts +17 -0
  7. package/dist/evidence/id.d.ts.map +1 -0
  8. package/dist/evidence/id.js +20 -0
  9. package/dist/evidence/id.js.map +1 -0
  10. package/dist/evidence/redact.d.ts +22 -0
  11. package/dist/evidence/redact.d.ts.map +1 -0
  12. package/dist/evidence/redact.js +97 -0
  13. package/dist/evidence/redact.js.map +1 -0
  14. package/dist/evidence/store.d.ts +51 -0
  15. package/dist/evidence/store.d.ts.map +1 -0
  16. package/dist/evidence/store.js +148 -0
  17. package/dist/evidence/store.js.map +1 -0
  18. package/dist/evidence/types.d.ts +183 -0
  19. package/dist/evidence/types.d.ts.map +1 -0
  20. package/dist/evidence/types.js +21 -0
  21. package/dist/evidence/types.js.map +1 -0
  22. package/dist/history/ingest-playwright.d.ts +26 -0
  23. package/dist/history/ingest-playwright.d.ts.map +1 -0
  24. package/dist/history/ingest-playwright.js +73 -0
  25. package/dist/history/ingest-playwright.js.map +1 -0
  26. package/dist/history/ingest.d.ts +29 -0
  27. package/dist/history/ingest.d.ts.map +1 -0
  28. package/dist/history/ingest.js +86 -0
  29. package/dist/history/ingest.js.map +1 -0
  30. package/dist/history/memory-index.d.ts +88 -0
  31. package/dist/history/memory-index.d.ts.map +1 -0
  32. package/dist/history/memory-index.js +236 -0
  33. package/dist/history/memory-index.js.map +1 -0
  34. package/dist/history/playwright-report.d.ts +102 -0
  35. package/dist/history/playwright-report.d.ts.map +1 -0
  36. package/dist/history/playwright-report.js +274 -0
  37. package/dist/history/playwright-report.js.map +1 -0
  38. package/dist/history/store.d.ts +73 -0
  39. package/dist/history/store.d.ts.map +1 -0
  40. package/dist/history/store.js +243 -0
  41. package/dist/history/store.js.map +1 -0
  42. package/dist/history/types.d.ts +69 -0
  43. package/dist/history/types.d.ts.map +1 -0
  44. package/dist/history/types.js +18 -0
  45. package/dist/history/types.js.map +1 -0
  46. package/dist/history/url.d.ts +79 -0
  47. package/dist/history/url.d.ts.map +1 -0
  48. package/dist/history/url.js +121 -0
  49. package/dist/history/url.js.map +1 -0
  50. package/dist/index.d.ts +39 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +31 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/locator/stability.d.ts +63 -0
  55. package/dist/locator/stability.d.ts.map +1 -0
  56. package/dist/locator/stability.js +127 -0
  57. package/dist/locator/stability.js.map +1 -0
  58. package/dist/taxonomy/classify.d.ts +63 -0
  59. package/dist/taxonomy/classify.d.ts.map +1 -0
  60. package/dist/taxonomy/classify.js +344 -0
  61. package/dist/taxonomy/classify.js.map +1 -0
  62. package/dist/taxonomy/kinds.d.ts +49 -0
  63. package/dist/taxonomy/kinds.d.ts.map +1 -0
  64. package/dist/taxonomy/kinds.js +139 -0
  65. package/dist/taxonomy/kinds.js.map +1 -0
  66. package/dist/taxonomy/parse-error.d.ts +85 -0
  67. package/dist/taxonomy/parse-error.d.ts.map +1 -0
  68. package/dist/taxonomy/parse-error.js +179 -0
  69. package/dist/taxonomy/parse-error.js.map +1 -0
  70. package/dist/version.d.ts +10 -0
  71. package/dist/version.d.ts.map +1 -0
  72. package/dist/version.js +10 -0
  73. package/dist/version.js.map +1 -0
  74. package/dist-cjs/.tsbuildinfo +1 -0
  75. package/dist-cjs/config/schema.js +283 -0
  76. package/dist-cjs/config/schema.js.map +1 -0
  77. package/dist-cjs/evidence/id.js +24 -0
  78. package/dist-cjs/evidence/id.js.map +1 -0
  79. package/dist-cjs/evidence/redact.js +103 -0
  80. package/dist-cjs/evidence/redact.js.map +1 -0
  81. package/dist-cjs/evidence/store.js +156 -0
  82. package/dist-cjs/evidence/store.js.map +1 -0
  83. package/dist-cjs/evidence/types.js +25 -0
  84. package/dist-cjs/evidence/types.js.map +1 -0
  85. package/dist-cjs/history/ingest-playwright.js +76 -0
  86. package/dist-cjs/history/ingest-playwright.js.map +1 -0
  87. package/dist-cjs/history/ingest.js +89 -0
  88. package/dist-cjs/history/ingest.js.map +1 -0
  89. package/dist-cjs/history/memory-index.js +242 -0
  90. package/dist-cjs/history/memory-index.js.map +1 -0
  91. package/dist-cjs/history/playwright-report.js +277 -0
  92. package/dist-cjs/history/playwright-report.js.map +1 -0
  93. package/dist-cjs/history/store.js +247 -0
  94. package/dist-cjs/history/store.js.map +1 -0
  95. package/dist-cjs/history/types.js +23 -0
  96. package/dist-cjs/history/types.js.map +1 -0
  97. package/dist-cjs/history/url.js +127 -0
  98. package/dist-cjs/history/url.js.map +1 -0
  99. package/dist-cjs/index.js +88 -0
  100. package/dist-cjs/index.js.map +1 -0
  101. package/dist-cjs/locator/stability.js +134 -0
  102. package/dist-cjs/locator/stability.js.map +1 -0
  103. package/dist-cjs/package.json +3 -0
  104. package/dist-cjs/taxonomy/classify.js +348 -0
  105. package/dist-cjs/taxonomy/classify.js.map +1 -0
  106. package/dist-cjs/taxonomy/kinds.js +145 -0
  107. package/dist-cjs/taxonomy/kinds.js.map +1 -0
  108. package/dist-cjs/taxonomy/parse-error.js +186 -0
  109. package/dist-cjs/taxonomy/parse-error.js.map +1 -0
  110. package/dist-cjs/version.js +13 -0
  111. package/dist-cjs/version.js.map +1 -0
  112. package/package.json +39 -0
@@ -0,0 +1,348 @@
1
+ "use strict";
2
+ /**
3
+ * Deterministic failure classification.
4
+ *
5
+ * No model. An ordered rule list, first match wins, most specific first.
6
+ * Every classification records WHICH rule fired and WHICH signals it saw, so a
7
+ * wrong verdict is debuggable rather than mysterious — the whole system routes
8
+ * on this decision, and an opaque router is an unfixable router.
9
+ *
10
+ * ORDERING IS LOAD-BEARING. Two ordering choices in particular:
11
+ *
12
+ * 1. `infra` is checked first. A crashed browser surfaces as a timeout or a
13
+ * missing element; classifying it as `locator_not_found` would send a
14
+ * dead environment to the healing engine.
15
+ *
16
+ * 2. `schema_violation` and `app_error` are checked BEFORE any locator rule.
17
+ * If the app threw an uncaught exception and, as a consequence, an element
18
+ * never rendered, the root cause is the exception. Healing the selector
19
+ * would paper over a real bug — the exact outcome the NEVER_HEAL set
20
+ * exists to prevent.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.classify = classify;
24
+ exports.listRules = listRules;
25
+ const parse_error_js_1 = require("./parse-error.js");
26
+ const has = (haystack, needle) => haystack.toLowerCase().includes(needle.toLowerCase());
27
+ const anyOf = (haystack, needles) => needles.filter(n => has(haystack, n));
28
+ const matcherIs = (f, ...names) => f.matcher !== null && names.some(n => f.matcher?.toLowerCase().includes(n.toLowerCase()) === true);
29
+ /** Signals that the application itself threw, rather than the test mis-looking. */
30
+ const UNCAUGHT_PATTERNS = [
31
+ 'Uncaught',
32
+ 'Unhandled',
33
+ 'Unhandled Promise Rejection',
34
+ 'TypeError:',
35
+ 'ReferenceError:',
36
+ 'The above error occurred in',
37
+ 'React will try to recreate',
38
+ ];
39
+ const RULES = [
40
+ // ── 1. Infrastructure ────────────────────────────────────────────────────
41
+ // First, always. A dead browser must never reach the healing engine.
42
+ {
43
+ name: 'infra.browser-closed',
44
+ kind: 'infra',
45
+ confidence: 'high',
46
+ match: f => {
47
+ const hits = anyOf(f.message + f.stack, [
48
+ 'Target page, context or browser has been closed',
49
+ 'Browser has been closed',
50
+ 'browserType.launch',
51
+ "Executable doesn't exist",
52
+ 'Protocol error',
53
+ 'Target crashed',
54
+ 'SIGSEGV',
55
+ 'out of memory',
56
+ ]);
57
+ return hits.length > 0 ? hits : null;
58
+ },
59
+ },
60
+ // ── 2. Contract violations — never healable ──────────────────────────────
61
+ {
62
+ name: 'contract.schema-violation',
63
+ kind: 'schema_violation',
64
+ confidence: 'high',
65
+ match: f => {
66
+ const hits = anyOf(f.message + f.stack, [
67
+ 'ZodError',
68
+ 'Validation error:',
69
+ 'invalid_type',
70
+ 'unrecognized_keys',
71
+ 'invalid_union',
72
+ 'Expected object, received',
73
+ 'Required at ',
74
+ ]);
75
+ const fromNetwork = f.failedRequests
76
+ .filter(r => r.schemaError !== null)
77
+ .map(r => `schema error on ${r.method} ${r.url}`);
78
+ const all = [...hits, ...fromNetwork];
79
+ return all.length > 0 ? all : null;
80
+ },
81
+ },
82
+ {
83
+ name: 'contract.app-error',
84
+ kind: 'app_error',
85
+ confidence: 'medium',
86
+ match: f => {
87
+ // Deliberately requires an UNCAUGHT signal, not merely the presence of
88
+ // console output. A stray console.warn must not veto a legitimate heal.
89
+ const consoleHits = f.consoleErrors.filter(e => UNCAUGHT_PATTERNS.some(p => has(e, p)));
90
+ const messageHits = anyOf(f.message, ['pageerror', 'page.on(\'pageerror\')']);
91
+ const all = [
92
+ ...consoleHits.map(e => `uncaught in console: ${e.slice(0, 120)}`),
93
+ ...messageHits,
94
+ ];
95
+ return all.length > 0 ? all : null;
96
+ },
97
+ },
98
+ // ── 3. Transport ─────────────────────────────────────────────────────────
99
+ {
100
+ name: 'transport.network-error',
101
+ kind: 'network_error',
102
+ confidence: 'high',
103
+ match: f => {
104
+ const hits = anyOf(f.message + f.stack, [
105
+ 'net::ERR_CONNECTION_REFUSED',
106
+ 'net::ERR_CONNECTION_RESET',
107
+ 'net::ERR_NAME_NOT_RESOLVED',
108
+ 'net::ERR_INTERNET_DISCONNECTED',
109
+ 'ECONNREFUSED',
110
+ 'ETIMEDOUT',
111
+ 'socket hang up',
112
+ 'fetch failed',
113
+ ]);
114
+ const fromRequests = f.failedRequests
115
+ .filter(r => r.failureText !== null)
116
+ .map(r => `request failed: ${r.method} ${r.url}`);
117
+ const all = [...hits, ...fromRequests];
118
+ return all.length > 0 ? all : null;
119
+ },
120
+ },
121
+ {
122
+ name: 'transport.navigation-failure',
123
+ kind: 'navigation_failure',
124
+ confidence: 'high',
125
+ match: f => {
126
+ const hits = anyOf(f.message, [
127
+ 'page.goto',
128
+ 'Navigation timeout',
129
+ 'navigation failed',
130
+ 'net::ERR_ABORTED',
131
+ ]);
132
+ return hits.length > 0 ? hits : null;
133
+ },
134
+ },
135
+ {
136
+ name: 'transport.http-status',
137
+ kind: 'http_status',
138
+ confidence: 'high',
139
+ match: f => {
140
+ if (matcherIs(f, 'toBeOK'))
141
+ return ['matcher toBeOK failed'];
142
+ const hits = anyOf(f.message, [
143
+ 'Unexpected status',
144
+ 'expected status',
145
+ 'toBeOK',
146
+ 'Response status code',
147
+ ]);
148
+ return hits.length > 0 ? hits : null;
149
+ },
150
+ },
151
+ // ── 4. Snapshot comparisons ──────────────────────────────────────────────
152
+ {
153
+ name: 'snapshot.visual-diff',
154
+ kind: 'visual_diff',
155
+ confidence: 'high',
156
+ match: f => {
157
+ if (matcherIs(f, 'toHaveScreenshot'))
158
+ return ['matcher toHaveScreenshot'];
159
+ const hits = anyOf(f.message, [
160
+ 'Screenshot comparison failed',
161
+ 'toHaveScreenshot',
162
+ 'pixels (ratio',
163
+ 'A snapshot doesn\'t exist at',
164
+ ]);
165
+ return hits.length > 0 ? hits : null;
166
+ },
167
+ },
168
+ {
169
+ name: 'snapshot.aria-diff',
170
+ kind: 'aria_diff',
171
+ confidence: 'high',
172
+ match: f => {
173
+ if (matcherIs(f, 'toMatchAriaSnapshot'))
174
+ return ['matcher toMatchAriaSnapshot'];
175
+ const hits = anyOf(f.message, ['toMatchAriaSnapshot', 'aria snapshot']);
176
+ return hits.length > 0 ? hits : null;
177
+ },
178
+ },
179
+ // ── 5. Locator resolution ────────────────────────────────────────────────
180
+ {
181
+ name: 'locator.ambiguous',
182
+ kind: 'locator_ambiguous',
183
+ confidence: 'high',
184
+ match: f => {
185
+ const hits = anyOf(f.message, ['strict mode violation', 'resolved to 2 elements']);
186
+ if (hits.length > 0)
187
+ return hits;
188
+ // "resolved to N elements" for any N > 1
189
+ return /resolved to (\d+) elements/.test(f.message) &&
190
+ !/resolved to 0 elements/.test(f.message)
191
+ ? ['strict mode: multiple matches']
192
+ : null;
193
+ },
194
+ },
195
+ {
196
+ name: 'locator.not-actionable',
197
+ kind: 'locator_not_actionable',
198
+ confidence: 'high',
199
+ match: f => {
200
+ const hits = anyOf(f.message, [
201
+ 'element is not visible',
202
+ 'element is not enabled',
203
+ 'element is not stable',
204
+ 'element is not editable',
205
+ 'intercepts pointer events',
206
+ 'element is outside of the viewport',
207
+ 'waiting for element to be visible, enabled and stable',
208
+ ]);
209
+ return hits.length > 0 ? hits : null;
210
+ },
211
+ },
212
+ {
213
+ name: 'locator.not-found',
214
+ kind: 'locator_not_found',
215
+ confidence: 'high',
216
+ match: f => {
217
+ const hits = anyOf(f.message, [
218
+ 'resolved to 0 elements',
219
+ // Playwright renders a failed visibility assertion on a missing
220
+ // element as `Received: <element(s) not found>`. That is a LOCATOR
221
+ // problem (the address is gone), not a visibility problem — and the
222
+ // distinction decides whether healing is even applicable, so this
223
+ // rule must stay ahead of assertion.visibility.
224
+ 'element(s) not found',
225
+ 'locator resolved to hidden',
226
+ 'no element matching',
227
+ 'Element is not attached to the DOM',
228
+ ]);
229
+ // Playwright's call log says "waiting for getByTestId('…')" or
230
+ // "waiting for locator('…')" depending on the API used.
231
+ const waiting = /waiting for (locator|getBy|frameLocator)/i.test(f.message)
232
+ ? ['call log: waiting for an element that never appeared']
233
+ : [];
234
+ // An action that timed out while resolving a locator is a not-found,
235
+ // not a generic test timeout.
236
+ const actionTimeout = f.timedOut && /locator\.\w+:|frameLocator|\.click\(|\.fill\(/.test(f.message)
237
+ ? ['action timed out resolving its locator']
238
+ : [];
239
+ const all = [...hits, ...waiting, ...actionTimeout];
240
+ return all.length > 0 ? all : null;
241
+ },
242
+ },
243
+ // ── 6. Assertions ────────────────────────────────────────────────────────
244
+ {
245
+ name: 'assertion.visibility',
246
+ kind: 'assertion_visibility',
247
+ confidence: 'high',
248
+ match: f => {
249
+ if (matcherIs(f, 'toBeVisible', 'toBeHidden', 'toBeAttached', 'toHaveCount')) {
250
+ return [`matcher ${f.matcher ?? ''} timed out`];
251
+ }
252
+ const hits = anyOf(f.message, ['toBeVisible', 'toBeHidden', 'toBeAttached', 'toHaveCount']);
253
+ return hits.length > 0 ? hits : null;
254
+ },
255
+ },
256
+ {
257
+ name: 'assertion.value-mismatch',
258
+ kind: 'assertion_value_mismatch',
259
+ confidence: 'high',
260
+ match: f => {
261
+ if (matcherIs(f, 'toHaveText', 'toContainText', 'toHaveValue', 'toHaveAttribute', 'toMatchObject', 'toEqual', 'toBe', 'toHaveURL', 'toHaveTitle')) {
262
+ return [`matcher ${f.matcher ?? ''} value mismatch`];
263
+ }
264
+ const hasExpectedReceived = (has(f.message, 'Expected') && has(f.message, 'Received')) ||
265
+ has(f.message, 'Expected string') ||
266
+ has(f.message, 'Expected pattern');
267
+ return hasExpectedReceived ? ['expected/received mismatch in message'] : null;
268
+ },
269
+ },
270
+ ];
271
+ /** Fallback used when a test timed out but nothing more specific matched. */
272
+ const TEST_TIMEOUT_RULE = {
273
+ name: 'timeout.test-level',
274
+ kind: 'assertion_visibility',
275
+ confidence: 'low',
276
+ match: f => f.timedOut || f.budgetUsedRatio >= 0.95
277
+ ? [`test consumed ${(f.budgetUsedRatio * 100).toFixed(0)}% of its time budget`]
278
+ : null,
279
+ };
280
+ /**
281
+ * Every rule below matches against `message` and `stack`, so the code frame
282
+ * Playwright embeds in a message — the user's own source, quoted with context —
283
+ * is matched against too. Strip it here, at the single choke point, rather than
284
+ * at each call site: there are two of those today (the reporter and the
285
+ * Playwright-JSON adapter), a caller who forgets gets silently wrong verdicts,
286
+ * and "silently wrong" is the one failure mode a router must not have.
287
+ */
288
+ function forMatching(failure) {
289
+ return {
290
+ ...failure,
291
+ message: (0, parse_error_js_1.stripCodeFrame)(failure.message),
292
+ stack: (0, parse_error_js_1.stripCodeFrame)(failure.stack),
293
+ };
294
+ }
295
+ /**
296
+ * Classify a Playwright failure into a {@link FailureKind}.
297
+ *
298
+ * First matching rule wins. The returned `rule` and `signals` are what make a
299
+ * wrong verdict debuggable — the rest of the system routes on this decision.
300
+ *
301
+ * @param input - Message, stack, matcher name, timeout flag, and optional
302
+ * console/network evidence.
303
+ * @returns The kind, the rule that fired, a confidence, and the signals it saw.
304
+ *
305
+ * @example
306
+ * ```ts
307
+ * const verdict = classify({
308
+ * message: "Error: locator('getByTestId('gym-card-name')') resolved to 0 elements",
309
+ * stack: '',
310
+ * timedOut: true,
311
+ * });
312
+ * // verdict.kind === 'locator_not_found'
313
+ * ```
314
+ */
315
+ function classify(input) {
316
+ const failure = forMatching(input);
317
+ for (const rule of RULES) {
318
+ const signals = rule.match(failure);
319
+ if (signals !== null && signals.length > 0) {
320
+ return { kind: rule.kind, rule: rule.name, confidence: rule.confidence, signals };
321
+ }
322
+ }
323
+ const timeoutSignals = TEST_TIMEOUT_RULE.match(failure);
324
+ if (timeoutSignals !== null && timeoutSignals.length > 0) {
325
+ return {
326
+ kind: TEST_TIMEOUT_RULE.kind,
327
+ rule: TEST_TIMEOUT_RULE.name,
328
+ confidence: TEST_TIMEOUT_RULE.confidence,
329
+ signals: timeoutSignals,
330
+ };
331
+ }
332
+ return {
333
+ kind: 'unknown',
334
+ rule: 'none',
335
+ confidence: 'low',
336
+ signals: ['no rule matched — this is a taxonomy gap worth reporting'],
337
+ };
338
+ }
339
+ /** Exposed for the CLI's `aplaytest doctor --rules` and for prompt-corpus tooling. */
340
+ /**
341
+ * The ordered rule list, for diagnostics and `aplaytest doctor`.
342
+ *
343
+ * @returns Rule name and kind, in evaluation order (first match wins).
344
+ */
345
+ function listRules() {
346
+ return [...RULES, TEST_TIMEOUT_RULE].map(r => ({ name: r.name, kind: r.kind }));
347
+ }
348
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/taxonomy/classify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ /**
3
+ * The failure taxonomy.
4
+ *
5
+ * Classification is deterministic — string and structure matching over the
6
+ * Playwright error plus features of the evidence bundle. No model is involved.
7
+ * The taxonomy exists to ROUTE a failure: to healing, to flaky analysis, or to
8
+ * "stop, this is a real bug".
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ROUTING = exports.NEVER_HEAL = exports.FAILURE_KINDS = void 0;
12
+ exports.healEligibility = healEligibility;
13
+ exports.isHealable = isHealable;
14
+ exports.countsTowardFlakeStats = countsTowardFlakeStats;
15
+ exports.FAILURE_KINDS = [
16
+ 'locator_not_found', // strict mode: 0 matches
17
+ 'locator_ambiguous', // strict mode violation: >1 match
18
+ 'locator_not_actionable', // found, but intercepted / disabled / unstable
19
+ 'assertion_value_mismatch', // toHaveText / toMatchObject / toHaveValue …
20
+ 'assertion_visibility', // toBeVisible / toBeHidden timed out
21
+ 'visual_diff', // toHaveScreenshot
22
+ 'aria_diff', // toMatchAriaSnapshot
23
+ 'navigation_failure',
24
+ 'network_error', // request failed / connection refused
25
+ 'http_status', // unexpected status in an API spec
26
+ 'schema_violation', // Zod parse failed — the wire contract broke
27
+ 'app_error', // console error / error boundary rendered
28
+ 'infra', // browser crash, OOM, port-forward down
29
+ 'unknown',
30
+ ];
31
+ /**
32
+ * Kinds that must NEVER produce a heal proposal, at any aggressiveness level.
33
+ *
34
+ * This is the most important guard in the system and it is code, not policy.
35
+ * A suite's Zod schemas and console-error assertions exist so that drift fails
36
+ * LOUDLY; a framework that "helpfully" repaired a `schema_violation` would
37
+ * destroy the most valuable signal the suite produces.
38
+ */
39
+ exports.NEVER_HEAL = new Set([
40
+ 'schema_violation',
41
+ 'app_error',
42
+ 'http_status',
43
+ 'network_error',
44
+ 'navigation_failure',
45
+ 'infra',
46
+ ]);
47
+ exports.ROUTING = {
48
+ locator_not_found: {
49
+ heal: 'full',
50
+ flake: 'weak',
51
+ note: 'Element address is gone. The bread-and-butter heal.',
52
+ },
53
+ locator_ambiguous: {
54
+ heal: 'full',
55
+ flake: 'weak',
56
+ note: 'More than one match — often a genuine duplication in the app.',
57
+ },
58
+ locator_not_actionable: {
59
+ heal: 'propose-only',
60
+ flake: 'strong',
61
+ note: 'Found but not interactable. Usually timing or animation, not a wrong selector.',
62
+ },
63
+ assertion_value_mismatch: {
64
+ heal: 'propose-only',
65
+ flake: 'weak',
66
+ note: 'Changing an assertion changes what the test proves. Human decides.',
67
+ },
68
+ assertion_visibility: {
69
+ heal: 'propose-only',
70
+ flake: 'strong',
71
+ note: 'Most common genuine flake.',
72
+ },
73
+ visual_diff: {
74
+ heal: 'propose-only',
75
+ flake: 'weak',
76
+ note: 'Route to the snapshot workflow, not to selector healing.',
77
+ },
78
+ aria_diff: {
79
+ heal: 'propose-only',
80
+ flake: 'weak',
81
+ note: 'A semantic change — nearly always a real change.',
82
+ },
83
+ navigation_failure: {
84
+ heal: 'never',
85
+ flake: 'strong',
86
+ note: 'Environment or app. Not a selector problem.',
87
+ },
88
+ network_error: {
89
+ heal: 'never',
90
+ flake: 'strong',
91
+ note: 'Environment or app. Not a selector problem.',
92
+ },
93
+ http_status: {
94
+ heal: 'never',
95
+ flake: 'weak',
96
+ note: 'The API behaved differently. That is the finding.',
97
+ },
98
+ schema_violation: {
99
+ heal: 'never',
100
+ flake: 'excluded',
101
+ note: 'The wire contract broke. This IS the bug — never repair it.',
102
+ },
103
+ app_error: {
104
+ heal: 'never',
105
+ flake: 'weak',
106
+ note: 'The application errored. This IS the bug — never repair it.',
107
+ },
108
+ infra: {
109
+ heal: 'never',
110
+ flake: 'excluded',
111
+ note: 'Browser crash or environment failure. Not evidence about the test.',
112
+ },
113
+ unknown: {
114
+ heal: 'never',
115
+ flake: 'weak',
116
+ note: 'Unclassified. Every occurrence is a taxonomy gap worth reporting.',
117
+ },
118
+ };
119
+ /**
120
+ * How far a heal may go for this kind. `NEVER_HEAL` wins over `ROUTING`.
121
+ *
122
+ * @param kind - A classified failure kind.
123
+ * @returns `'never'`, `'propose-only'`, or `'full'`.
124
+ */
125
+ function healEligibility(kind) {
126
+ if (exports.NEVER_HEAL.has(kind))
127
+ return 'never';
128
+ return exports.ROUTING[kind].heal;
129
+ }
130
+ /**
131
+ * @param kind - A classified failure kind.
132
+ * @returns `true` when a heal may be proposed (not necessarily auto-applied).
133
+ */
134
+ function isHealable(kind) {
135
+ return healEligibility(kind) !== 'never';
136
+ }
137
+ /**
138
+ * @param kind - A classified failure kind.
139
+ * @returns `false` for infra, HTTP status, and schema violations — those are
140
+ * not evidence of flakiness.
141
+ */
142
+ function countsTowardFlakeStats(kind) {
143
+ return exports.ROUTING[kind].flake !== 'excluded';
144
+ }
145
+ //# sourceMappingURL=kinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kinds.js","sourceRoot":"","sources":["../../src/taxonomy/kinds.ts"],"names":[],"mappings":"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"}