@ia-qa/self-healing 1.19.1 → 1.24.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 (71) hide show
  1. package/README.md +64 -3
  2. package/TUTORIAL.md +35 -4
  3. package/dist/aom.d.ts +20 -0
  4. package/dist/aom.js +25 -0
  5. package/dist/aom.js.map +1 -1
  6. package/dist/browser/resolve.js +4 -1
  7. package/dist/browser/resolve.js.map +1 -1
  8. package/dist/captureMerge.d.ts +11 -0
  9. package/dist/captureMerge.js +4 -1
  10. package/dist/captureMerge.js.map +1 -1
  11. package/dist/cli/args.js +1 -1
  12. package/dist/cli/args.js.map +1 -1
  13. package/dist/cli/audit.d.ts +22 -1
  14. package/dist/cli/audit.js +43 -6
  15. package/dist/cli/audit.js.map +1 -1
  16. package/dist/cli/diff.d.ts +62 -0
  17. package/dist/cli/diff.js +104 -4
  18. package/dist/cli/diff.js.map +1 -1
  19. package/dist/cli/explain.js +57 -12
  20. package/dist/cli/explain.js.map +1 -1
  21. package/dist/cli/fix.d.ts +15 -0
  22. package/dist/cli/fix.js +13 -2
  23. package/dist/cli/fix.js.map +1 -1
  24. package/dist/cli/index.js +9 -2
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/map.d.ts +2 -0
  27. package/dist/cli/map.js +13 -0
  28. package/dist/cli/map.js.map +1 -1
  29. package/dist/cli/run.js +6 -4
  30. package/dist/cli/run.js.map +1 -1
  31. package/dist/cli-ai/index.js +2 -1
  32. package/dist/cli-ai/index.js.map +1 -1
  33. package/dist/cypress/capture.js +16 -6
  34. package/dist/cypress/capture.js.map +1 -1
  35. package/dist/exercised.d.ts +15 -0
  36. package/dist/exercised.js +7 -1
  37. package/dist/exercised.js.map +1 -1
  38. package/dist/explain.d.ts +78 -3
  39. package/dist/explain.js +87 -9
  40. package/dist/explain.js.map +1 -1
  41. package/dist/htmlReport.js +39 -0
  42. package/dist/htmlReport.js.map +1 -1
  43. package/dist/index.d.ts +1 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/ingest.d.ts +30 -0
  46. package/dist/ingest.js +46 -1
  47. package/dist/ingest.js.map +1 -1
  48. package/dist/junit.js +41 -0
  49. package/dist/junit.js.map +1 -1
  50. package/dist/mcp/server.js +11 -0
  51. package/dist/mcp/server.js.map +1 -1
  52. package/dist/nameDrift.d.ts +25 -1
  53. package/dist/nameDrift.js +37 -7
  54. package/dist/nameDrift.js.map +1 -1
  55. package/dist/playwright/capture.js +7 -4
  56. package/dist/playwright/capture.js.map +1 -1
  57. package/dist/redirectFix.d.ts +60 -0
  58. package/dist/redirectFix.js +73 -0
  59. package/dist/redirectFix.js.map +1 -0
  60. package/dist/resolution.d.ts +41 -4
  61. package/dist/resolution.js +66 -5
  62. package/dist/resolution.js.map +1 -1
  63. package/dist/routeDrift.d.ts +105 -0
  64. package/dist/routeDrift.js +96 -0
  65. package/dist/routeDrift.js.map +1 -0
  66. package/dist/selenium/capture.js +14 -3
  67. package/dist/selenium/capture.js.map +1 -1
  68. package/dist/ui/server.js +5 -6
  69. package/dist/ui/server.js.map +1 -1
  70. package/package.json +1 -1
  71. package/skills/ia-qa-heal/SKILL.md +23 -1
@@ -0,0 +1,60 @@
1
+ import type { PageTarget } from './config';
2
+ /**
3
+ * A declared page whose URL the app no longer serves, and where it sends the browser instead.
4
+ *
5
+ * `map` already knows this: `assertLanded` returns `redirectedTo` and it reaches
6
+ * `MapPageStat.landedOn`. Until now the remedy was a config edit by hand, repeated on every
7
+ * app that reorganises its URLs — and left undone, the contract for `/articles` describes
8
+ * `/resources` under the name `articles`, which is the wrong-identity class that a multi-host
9
+ * `/login` collision belongs to.
10
+ */
11
+ export interface RedirectFix {
12
+ /** The page name in `config.pages`. */
13
+ name: string;
14
+ /** The URL the config declares. */
15
+ from: string;
16
+ /** Where the browser actually landed. */
17
+ to: string;
18
+ }
19
+ /**
20
+ * A group of pages refused because they all landed on the same place.
21
+ *
22
+ * **This is the reason this module is not three lines.** A session that stopped holding sends
23
+ * *every* page to the login screen, and each one arrives here as a redirect. Applying that
24
+ * would rewrite the whole of `config.pages` to point at the login page — a config nobody could
25
+ * recover by hand, produced by the tool, on a run whose only real fault was an expired cookie.
26
+ *
27
+ * `LoginWallError` already catches the walled case and never yields a `landedOn`, so this is
28
+ * the second line of defence rather than the first: an app that answers a wall with a 302 to
29
+ * `/signin` rather than a login form, an outage routing everything to a status page, a
30
+ * maintenance banner. One page moving is a migration; several pages arriving at one place is a
31
+ * condition of the run.
32
+ *
33
+ * Refused as a *group*, never as the whole plan: a genuine single-page move in the same run
34
+ * still applies. And named, never dropped — a filter nobody can see is a blind spot.
35
+ */
36
+ export interface RedirectRefusal {
37
+ target: string;
38
+ pages: string[];
39
+ }
40
+ export interface RedirectPlan {
41
+ fixes: RedirectFix[];
42
+ refused: RedirectRefusal[];
43
+ }
44
+ export interface RedirectInput {
45
+ /** `page` and `landedOn` off `MapPageStat` — everything else is irrelevant here. */
46
+ stats: Array<{
47
+ page: string;
48
+ landedOn?: string;
49
+ }>;
50
+ pages: PageTarget[];
51
+ baseUrl?: string;
52
+ }
53
+ export declare function planRedirectFixes({ stats, pages, baseUrl }: RedirectInput): RedirectPlan;
54
+ /** The config's pages with the planned moves applied. Pure — the caller decides to write. */
55
+ export declare function applyRedirectFixes(pages: PageTarget[], fixes: RedirectFix[]): PageTarget[];
56
+ /**
57
+ * What the terminal says. One renderer, so the report and the write cannot describe different
58
+ * plans — the `checkHeadline` rule.
59
+ */
60
+ export declare function redirectPlanLines(plan: RedirectPlan, applied: boolean): string[];
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.planRedirectFixes = planRedirectFixes;
4
+ exports.applyRedirectFixes = applyRedirectFixes;
5
+ exports.redirectPlanLines = redirectPlanLines;
6
+ const routeDrift_1 = require("./routeDrift");
7
+ function planRedirectFixes({ stats, pages, baseUrl }) {
8
+ const declared = new Map(pages.map((p) => [p.name, p.url]));
9
+ const candidates = [];
10
+ for (const stat of stats) {
11
+ const to = stat.landedOn;
12
+ const from = declared.get(stat.page);
13
+ // A page the config does not declare has no entry to rewrite. A landing that resolves to
14
+ // the declared URL is the ordinary case (a trailing slash, an absolute form) and is not a
15
+ // move — folding it here is what keeps this silent on a healthy app.
16
+ if (!to || !from || (0, routeDrift_1.sameDestination)(from, to, baseUrl))
17
+ continue;
18
+ candidates.push({ name: stat.page, from, to });
19
+ }
20
+ const byTarget = new Map();
21
+ for (const c of candidates) {
22
+ const key = destinationKey(c.to, baseUrl);
23
+ byTarget.set(key, [...(byTarget.get(key) ?? []), c]);
24
+ }
25
+ const fixes = [];
26
+ const refused = [];
27
+ for (const group of byTarget.values()) {
28
+ if (group.length > 1)
29
+ refused.push({ target: group[0].to, pages: group.map((g) => g.name) });
30
+ else
31
+ fixes.push(group[0]);
32
+ }
33
+ return { fixes, refused };
34
+ }
35
+ function destinationKey(url, baseUrl) {
36
+ try {
37
+ const u = new URL(url, baseUrl || 'http://redirect-fix.invalid');
38
+ return `${u.host}${u.pathname.replace(/\/+$/, '')}${u.search}`;
39
+ }
40
+ catch {
41
+ return url;
42
+ }
43
+ }
44
+ /** The config's pages with the planned moves applied. Pure — the caller decides to write. */
45
+ function applyRedirectFixes(pages, fixes) {
46
+ const to = new Map(fixes.map((f) => [f.name, f.to]));
47
+ return pages.map((p) => (to.has(p.name) ? { ...p, url: to.get(p.name) } : p));
48
+ }
49
+ /**
50
+ * What the terminal says. One renderer, so the report and the write cannot describe different
51
+ * plans — the `checkHeadline` rule.
52
+ */
53
+ function redirectPlanLines(plan, applied) {
54
+ const out = [];
55
+ if (plan.fixes.length > 0) {
56
+ const n = plan.fixes.length;
57
+ out.push(applied
58
+ ? ` ↪️ ${n} declared page${n === 1 ? '' : 's'} updated in config.json:`
59
+ : ` ↪️ ${n} declared page${n === 1 ? ' is' : 's are'} no longer at the URL config.json declares:`);
60
+ for (const f of plan.fixes)
61
+ out.push(` ${f.name}: ${f.from} → ${f.to}`);
62
+ out.push(applied
63
+ ? ` Written to config.json. Re-run \`ia-qa-heal map\` so the contracts match the new URLs.`
64
+ : ` Run \`ia-qa-heal map --fix-redirects\` to write these, or edit config.json yourself.`);
65
+ }
66
+ for (const r of plan.refused) {
67
+ // Loud, because this is the shape of an expired session and the user's next move should
68
+ // be to check that rather than to reach for the flag again.
69
+ out.push(` ⚠️ ${r.pages.length} declared pages all landed on ${r.target} — not rewriting any of them.`, ` ${r.pages.join(', ')}`, ` Several pages arriving at one place is a condition of the run, not a migration:`, ` an expired session, a redirect to sign-in, an outage. Check \`ia-qa-heal session --check\`.`);
70
+ }
71
+ return out;
72
+ }
73
+ //# sourceMappingURL=redirectFix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirectFix.js","sourceRoot":"","sources":["../src/redirectFix.ts"],"names":[],"mappings":"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"}
@@ -31,6 +31,21 @@ export interface Binding {
31
31
  selector?: string;
32
32
  /** How many elements matched. Only ever set on `ambiguous`. */
33
33
  count?: number;
34
+ /**
35
+ * The contract selectors an `ambiguous` string reached — every element it could have
36
+ * meant. Only ever set on `ambiguous`, and it is what makes that state *judgeable* later
37
+ * instead of merely countable.
38
+ *
39
+ * It was thrown away for a long time, and the cost was a whole class of missed drift: a
40
+ * selector that matched two contracted elements and now matches none had no recorded
41
+ * element to ask about, so `diffBindings` dropped it in silence and `explain` concluded
42
+ * the string had never reached anything. A count cannot answer "did what it pointed at
43
+ * survive"; a list of selectors can, because each one is probed again next capture.
44
+ *
45
+ * Absent on any file written before this field existed — which is read as *not recorded*,
46
+ * never as *nothing*: the transition is still reported, without naming candidates.
47
+ */
48
+ selectors?: string[];
34
49
  }
35
50
  export interface PageResolution {
36
51
  page: string;
@@ -152,8 +167,13 @@ export declare function countBindings(resolution: PageResolution | null): {
152
167
  total: number;
153
168
  };
154
169
  /**
155
- * What happened to a binding between two moments. Only selectors that were `bound` at
156
- * baseline are judged: a selector that never bound has nothing to have lost.
170
+ * What happened to a binding between two moments.
171
+ *
172
+ * A *steady* non-binding state is never judged — a selector that is ambiguous, or matches
173
+ * an uncontracted element, every single run has nothing to have lost, and reporting it
174
+ * would fire on every ordinary run. A **transition out of one** is the opposite fact and
175
+ * is reported: `outside` → `unresolved` as `dangling`, `ambiguous` → `unresolved` as
176
+ * `ambiguous`. Both are a human's call and neither is ever rewritten.
157
177
  */
158
178
  export type BindingDriftStatus = 'held' | 'broken' | 'rebound' | 'ambiguous' | 'gone' | 'dangling';
159
179
  export interface BindingDrift {
@@ -169,6 +189,17 @@ export interface BindingDrift {
169
189
  now?: string;
170
190
  /** The contract selector to rewrite to — `broken` only. */
171
191
  healedSelector?: string;
192
+ /**
193
+ * On `ambiguous`: the selectors the surviving candidates answer to now — every element
194
+ * the string could have meant and that is still on the page.
195
+ *
196
+ * Deliberately not `healedSelector`, even when there is exactly one. The field name is
197
+ * the promise: `healedSelector` is consumed by `computeLocatorRewrites`, and a baseline
198
+ * that never established *which* element the test meant cannot license an edit to that
199
+ * test. One surviving candidate makes a human's decision quick; it does not make it the
200
+ * tool's.
201
+ */
202
+ candidates?: string[];
172
203
  }
173
204
  /**
174
205
  * Compare two moments of one page's bindings.
@@ -177,8 +208,14 @@ export interface BindingDrift {
177
208
  * selector?" — it is the contract diff's own conclusion, passed in rather than recomputed,
178
209
  * so a binding verdict can never disagree with the element verdict beside it.
179
210
  *
180
- * Returns `null` for everything that is not drift, which is most of it: an intact binding,
181
- * an `outside` match, a selector that never bound. Silence is the point (SPEC §2.1).
211
+ * Emits nothing for everything that is not drift, which is most of it: an intact binding, a
212
+ * steady `outside` or `ambiguous` match, a selector that reached nothing at either moment.
213
+ * Silence is the point (SPEC §2.1).
214
+ *
215
+ * This sentence used to read "a selector that never bound", and that wording is what the
216
+ * defect was made of: it collapsed *never worked* with *stopped working*, which is the one
217
+ * distinction the whole function exists to draw. A selector that was `ambiguous` and now
218
+ * resolves to nothing never bound in the strict sense, and it is drift.
182
219
  */
183
220
  export declare function diffBindings(before: PageResolution | null, after: PageResolution | null, elementNow: (contractSelector: string) => {
184
221
  present: boolean;
@@ -47,6 +47,16 @@ exports.diffBindings = diffBindings;
47
47
  const fs = __importStar(require("fs"));
48
48
  const path = __importStar(require("path"));
49
49
  const config_1 = require("./config");
50
+ /**
51
+ * The candidate lists of two observations, unioned — and omitted entirely when neither
52
+ * recorded one, so a file written before the field existed never grows an empty list that
53
+ * would read as "it reached nothing under contract".
54
+ */
55
+ function ambiguousCandidates(a, b) {
56
+ const merged = [...(a.selectors ?? []), ...(b.selectors ?? [])];
57
+ const seen = merged.filter((s, i) => merged.indexOf(s) === i);
58
+ return seen.length > 0 ? { selectors: seen } : {};
59
+ }
50
60
  /**
51
61
  * Combine two observations of the same selector, on the same page, at the same moment.
52
62
  *
@@ -69,7 +79,15 @@ function mergeBinding(a, b) {
69
79
  if (a.status === 'invalid' || b.status === 'invalid')
70
80
  return { status: 'invalid' };
71
81
  if (a.status === 'ambiguous' || b.status === 'ambiguous') {
72
- return { status: 'ambiguous', count: Math.max(a.count ?? 0, b.count ?? 0) || undefined };
82
+ return {
83
+ status: 'ambiguous',
84
+ count: Math.max(a.count ?? 0, b.count ?? 0) || undefined,
85
+ // Candidates widen while everything else here restricts, and that is not an
86
+ // exception to the rule — it is the rule. The list says *what this string could have
87
+ // meant*, so a shorter one claims more. Dropping a candidate is how a later capture
88
+ // comes to call a repair unique when it is not.
89
+ ...ambiguousCandidates(a, b),
90
+ };
73
91
  }
74
92
  if (a.status === 'unresolved')
75
93
  return b;
@@ -79,13 +97,17 @@ function mergeBinding(a, b) {
79
97
  // observations that name *different kinds* of thing are a divergence too: the string
80
98
  // reaches more than the one element a rewrite would be built for.
81
99
  const names = (x) => x.status === 'bound' || x.status === 'anchored';
100
+ const named = [a, b].filter(names).map((x) => x.selector).filter(Boolean);
101
+ const candidates = named.length > 0 ? { selectors: named.filter((s, i) => named.indexOf(s) === i) } : {};
82
102
  if (names(a) && names(b)) {
83
- return a.selector === b.selector && a.status === b.status ? a : { status: 'ambiguous' };
103
+ // Ambiguity manufactured here knows exactly which elements disagreed, and saying so
104
+ // costs nothing: it is the same list the browser would have recorded.
105
+ return a.selector === b.selector && a.status === b.status ? a : { status: 'ambiguous', ...candidates };
84
106
  }
85
107
  // One binds, the other matched something uncontracted: the string reaches more than the
86
108
  // element we would rewrite for, so it is not safe to rewrite at all.
87
109
  if (names(a) || names(b))
88
- return { status: 'ambiguous' };
110
+ return { status: 'ambiguous', ...candidates };
89
111
  return { status: 'outside' };
90
112
  }
91
113
  /** Merge a fresh observation into an existing page resolution, binding by binding. */
@@ -319,8 +341,14 @@ function anchoredDrift(selector, anchor, now, after) {
319
341
  * selector?" — it is the contract diff's own conclusion, passed in rather than recomputed,
320
342
  * so a binding verdict can never disagree with the element verdict beside it.
321
343
  *
322
- * Returns `null` for everything that is not drift, which is most of it: an intact binding,
323
- * an `outside` match, a selector that never bound. Silence is the point (SPEC §2.1).
344
+ * Emits nothing for everything that is not drift, which is most of it: an intact binding, a
345
+ * steady `outside` or `ambiguous` match, a selector that reached nothing at either moment.
346
+ * Silence is the point (SPEC §2.1).
347
+ *
348
+ * This sentence used to read "a selector that never bound", and that wording is what the
349
+ * defect was made of: it collapsed *never worked* with *stopped working*, which is the one
350
+ * distinction the whole function exists to draw. A selector that was `ambiguous` and now
351
+ * resolves to nothing never bound in the strict sense, and it is drift.
324
352
  */
325
353
  function diffBindings(before, after, elementNow) {
326
354
  if (!before || !after)
@@ -351,6 +379,39 @@ function diffBindings(before, after, elementNow) {
351
379
  out.push({ selector, status: 'dangling' });
352
380
  continue;
353
381
  }
382
+ // `ambiguous` → `unresolved`: the string used to reach several contracted elements and
383
+ // now reaches none. The test writing it is red right now.
384
+ //
385
+ // This was silent, and the silence was inherited rather than chosen. It came from the
386
+ // line below, whose rule — only a `bound` baseline is judged — is right about the
387
+ // *steady* state: a selector that is ambiguous every run has nothing to have lost, and
388
+ // reporting it would fire on every ordinary run. The transition is the opposite fact,
389
+ // and the branch immediately above already admits its twin (`outside` → `unresolved`)
390
+ // for exactly this reason. Measured cost of the omission: a cart link migrated from
391
+ // `/index.php/cart` to `/cart` across every page of an app, the suite red on it, and
392
+ // the tool reported no drift at all.
393
+ //
394
+ // What can be said is again bounded by what was recorded. With candidates on file, the
395
+ // question "did the elements survive" is answerable per candidate and the surviving
396
+ // ones are named — as a **human's** call, never a rewrite: whichever of the N elements
397
+ // the test meant is exactly what an ambiguous binding failed to establish, so a repair
398
+ // here would be a coin flip the tool dressed as a fix. `ambiguous` never reaches
399
+ // `computeLocatorRewrites`, and this row keeps that property.
400
+ if (was.status === 'ambiguous') {
401
+ if (now.status === 'unresolved') {
402
+ const survivors = (was.selectors ?? [])
403
+ .map((cs) => elementNow(cs))
404
+ .filter((e) => !!e && e.present)
405
+ .map((e) => e.selector);
406
+ const unique = survivors.filter((s, i) => survivors.indexOf(s) === i);
407
+ out.push({
408
+ selector,
409
+ status: 'ambiguous',
410
+ ...(unique.length > 0 ? { candidates: unique } : {}),
411
+ });
412
+ }
413
+ continue;
414
+ }
354
415
  if ((was.status !== 'bound' && was.status !== 'anchored') || !was.selector)
355
416
  continue;
356
417
  if (was.status === 'anchored') {
@@ -1 +1 @@
1
- {"version":3,"file":"resolution.js","sourceRoot":"","sources":["../src/resolution.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolution.js","sourceRoot":"","sources":["../src/resolution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ import type { MappedElement } from './aom';
2
+ import type { RouteSite, Usage } from './ingest';
3
+ /**
4
+ * A link whose **destination** changed — not merely its address.
5
+ *
6
+ * `stableSelector` prefers `a[href="…"]`, so moving a route rewrites the link's selector and
7
+ * `diffMappings` reports `healable`: same role, same accessible name, new selector. Correct,
8
+ * and rendered next to a button that slid one slot down the DOM:
9
+ *
10
+ * ```
11
+ * 🔧 drifted button "▶ Run" div:nth-of-type(5) > … → div:nth-of-type(9) > …
12
+ * 🔧 drifted link "Write a contract in the browser →"
13
+ * a[href="/devtools/eval-contract-runner"] → a[href="/qatools/eval-contract"]
14
+ * ```
15
+ *
16
+ * The first moved. The second now takes the user to a different page — measured the same day:
17
+ * the old route answered 404, the new one 200, and a `test.fail` in the suite pinning that 404
18
+ * had silently become a failing test because the app was fixed by moving the route.
19
+ *
20
+ * Reported **beside** the row, never instead of it: `healable` keeps its promise at the
21
+ * element level (`fix` rewrites the locator, it still reaches the same link) and breaks it at
22
+ * the navigation level (nothing repairs `page.goto('/devtools/eval-contract-runner')`).
23
+ *
24
+ * Measured on two real corpora two captures apart: **2 findings over 4 563 named links** on
25
+ * ia-qa.com, **0** on the other. The pre-build script said 3 — it paired links by name, and a
26
+ * *new* link added beside an unchanged one read as a destination change. That is precisely the
27
+ * false positive rule 2 (identity must have held) removes. See `SPEC-route-drift.md`.
28
+ *
29
+ * It lives outside `src/browser/match.js` for the reason `attachBaselineHrefs` already states
30
+ * in `cli/diff.ts`: href is not identity, and that file ships three times.
31
+ */
32
+ export interface RouteChange {
33
+ /** The link's accessible name. Unchanged by construction — that is what pairs the two. */
34
+ name: string;
35
+ /** Where it used to go. */
36
+ from: string;
37
+ /** Where it goes now. */
38
+ to: string;
39
+ /** The baseline selector, so a reader can tie this to the row above it. */
40
+ selector: string;
41
+ /**
42
+ * Which page carries the link. Added after the first run on real data: `--dir` flattens
43
+ * findings from 148 pages into one list, and two links to the same moved route came back
44
+ * as two lines nobody could locate.
45
+ */
46
+ page?: string;
47
+ /**
48
+ * Where the suite navigates to `from`, from `usage.routes`.
49
+ *
50
+ * Present only when the inventory holds it. Absent means *not measured* — never "no test
51
+ * goes there" — and it is the only thing that lets this finding touch the verdict.
52
+ */
53
+ usedAt?: RouteSite[];
54
+ }
55
+ /**
56
+ * Is this the same destination written differently?
57
+ *
58
+ * Three things are address, not destination, and folding them is what keeps the finding at
59
+ * 0.07 %: **absolute vs relative** on the same host (an app that starts emitting full URLs
60
+ * changed nothing for the user), the **trailing slash**, and the **fragment** (`/docs#install`
61
+ * and `/docs#usage` are one page; an in-page anchor is not a navigation).
62
+ *
63
+ * The query string is **kept**. `?tab=billing` is where the user lands, and a link repointed
64
+ * from one tab to another is exactly the kind of change this exists to surface.
65
+ *
66
+ * A base URL is used only to give a relative href a host to be compared against. Without one
67
+ * both sides are normalised against the same placeholder, so relative-vs-relative still works
68
+ * and relative-vs-absolute conservatively reads as a change — the safe direction.
69
+ */
70
+ export declare function sameDestination(a: string, b: string, baseUrl?: string): boolean;
71
+ export interface RouteDriftInput {
72
+ /** Diff rows, already masked — this reads them, it never recomputes a status. */
73
+ rows: Array<{
74
+ status: string;
75
+ role: string;
76
+ name: string;
77
+ selector: string;
78
+ healedSelector?: string;
79
+ }>;
80
+ before: MappedElement[];
81
+ after: MappedElement[];
82
+ baseUrl?: string;
83
+ usage?: Usage | null;
84
+ /** The page these rows describe, carried onto every finding. */
85
+ page?: string;
86
+ }
87
+ export declare function routeDrift({ rows, before, after, baseUrl, usage, page }: RouteDriftInput): RouteChange[];
88
+ /**
89
+ * Call sites in the suite that navigate to this route.
90
+ *
91
+ * Matched through `sameDestination`, not by string equality: a suite writing
92
+ * `page.goto('https://app.test/cart')` against a contract holding `/cart` is the same
93
+ * navigation, and comparing the raw strings would report *not measured* over a suite that
94
+ * demonstrably goes there.
95
+ */
96
+ export declare function navigationsTo(route: string, baseUrl: string | undefined, usage: Usage | null | undefined): RouteSite[];
97
+ /**
98
+ * Does a destination change hold the verdict?
99
+ *
100
+ * Only when the suite navigates to the old route — then that suite is red and this can prove
101
+ * it. On its own the finding never gates: an app is allowed to reorganise its URLs, that is
102
+ * not a regression, and a gate that goes red on it is a gate someone switches off. Same shape
103
+ * as `nameDrift`: no inventory ⇒ no escalation, so an un-ingested project is unaffected.
104
+ */
105
+ export declare function routeDriftBlocks(changes: RouteChange[]): RouteChange[];
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sameDestination = sameDestination;
4
+ exports.routeDrift = routeDrift;
5
+ exports.navigationsTo = navigationsTo;
6
+ exports.routeDriftBlocks = routeDriftBlocks;
7
+ /** Rows whose element identity held. A `lost` link has no "after" to compare a destination to. */
8
+ const COMPARABLE = new Set(['ok', 'renamed', 'healable']);
9
+ /**
10
+ * Is this the same destination written differently?
11
+ *
12
+ * Three things are address, not destination, and folding them is what keeps the finding at
13
+ * 0.07 %: **absolute vs relative** on the same host (an app that starts emitting full URLs
14
+ * changed nothing for the user), the **trailing slash**, and the **fragment** (`/docs#install`
15
+ * and `/docs#usage` are one page; an in-page anchor is not a navigation).
16
+ *
17
+ * The query string is **kept**. `?tab=billing` is where the user lands, and a link repointed
18
+ * from one tab to another is exactly the kind of change this exists to surface.
19
+ *
20
+ * A base URL is used only to give a relative href a host to be compared against. Without one
21
+ * both sides are normalised against the same placeholder, so relative-vs-relative still works
22
+ * and relative-vs-absolute conservatively reads as a change — the safe direction.
23
+ */
24
+ function sameDestination(a, b, baseUrl) {
25
+ return destination(a, baseUrl) === destination(b, baseUrl);
26
+ }
27
+ function destination(href, baseUrl) {
28
+ const raw = href.trim();
29
+ try {
30
+ const u = new URL(raw, baseUrl || 'http://route-drift.invalid');
31
+ const path = u.pathname.replace(/\/+$/, '') || '/';
32
+ return `${u.protocol}//${u.host}${path}${u.search}`;
33
+ }
34
+ catch {
35
+ // A href the URL parser refuses (`javascript:`, `mailto:`, a template left in the DOM)
36
+ // is compared as written. Never dropped: silence would read as "unchanged".
37
+ return raw;
38
+ }
39
+ }
40
+ function routeDrift({ rows, before, after, baseUrl, usage, page }) {
41
+ const beforeHref = hrefIndex(before);
42
+ const afterHref = hrefIndex(after);
43
+ const out = [];
44
+ for (const row of rows) {
45
+ if (row.role !== 'link' || !COMPARABLE.has(row.status))
46
+ continue;
47
+ const from = beforeHref.get(row.selector);
48
+ const to = afterHref.get(row.healedSelector ?? row.selector);
49
+ // No href on either side is an ordinary link the capture recorded without one — not a
50
+ // destination that disappeared. `map` writes `href` from the attribute; absent means the
51
+ // element never had one to compare.
52
+ if (!from || !to || sameDestination(from, to, baseUrl))
53
+ continue;
54
+ const usedAt = navigationsTo(from, baseUrl, usage);
55
+ out.push({ name: row.name, from, to, selector: row.selector, ...(page ? { page } : {}), ...(usedAt.length > 0 ? { usedAt } : {}) });
56
+ }
57
+ return out;
58
+ }
59
+ function hrefIndex(elements) {
60
+ const out = new Map();
61
+ for (const e of elements)
62
+ if (e.href)
63
+ out.set(e.selector, e.href);
64
+ return out;
65
+ }
66
+ /**
67
+ * Call sites in the suite that navigate to this route.
68
+ *
69
+ * Matched through `sameDestination`, not by string equality: a suite writing
70
+ * `page.goto('https://app.test/cart')` against a contract holding `/cart` is the same
71
+ * navigation, and comparing the raw strings would report *not measured* over a suite that
72
+ * demonstrably goes there.
73
+ */
74
+ function navigationsTo(route, baseUrl, usage) {
75
+ const routes = usage?.routes;
76
+ if (!routes)
77
+ return [];
78
+ const out = [];
79
+ for (const [written, sites] of Object.entries(routes)) {
80
+ if (sameDestination(written, route, baseUrl))
81
+ out.push(...sites);
82
+ }
83
+ return out;
84
+ }
85
+ /**
86
+ * Does a destination change hold the verdict?
87
+ *
88
+ * Only when the suite navigates to the old route — then that suite is red and this can prove
89
+ * it. On its own the finding never gates: an app is allowed to reorganise its URLs, that is
90
+ * not a regression, and a gate that goes red on it is a gate someone switches off. Same shape
91
+ * as `nameDrift`: no inventory ⇒ no escalation, so an un-ingested project is unaffected.
92
+ */
93
+ function routeDriftBlocks(changes) {
94
+ return changes.filter((c) => (c.usedAt?.length ?? 0) > 0);
95
+ }
96
+ //# sourceMappingURL=routeDrift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routeDrift.js","sourceRoot":"","sources":["../src/routeDrift.ts"],"names":[],"mappings":"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"}
@@ -69,6 +69,14 @@ function captureEnabled() {
69
69
  }
70
70
  /** Keyed by `captureKey()`, not by page name — see there. */
71
71
  const pages = new Map();
72
+ /**
73
+ * Page names a visit might have been, when the URL could not say which.
74
+ *
75
+ * Same refusal, same fix, same file shape as the Playwright and Cypress hooks — guardrail #7.
76
+ * A bare `return` here turned an honest refusal into a silent drop, and `coverage` then
77
+ * reported those pages as never visited.
78
+ */
79
+ const unattributed = new Set();
72
80
  let cfg = null;
73
81
  let cfgLoaded = false;
74
82
  function config() {
@@ -85,7 +93,7 @@ function config() {
85
93
  }
86
94
  function writeShard() {
87
95
  try {
88
- if (pages.size === 0)
96
+ if (pages.size === 0 && unattributed.size === 0)
89
97
  return;
90
98
  const dir = (0, captureMerge_1.captureDir)();
91
99
  fs.mkdirSync(dir, { recursive: true });
@@ -95,7 +103,7 @@ function writeShard() {
95
103
  url: c.url,
96
104
  elements: c.elements,
97
105
  }));
98
- fs.writeFileSync(path.join(dir, `sel-${worker}.json`), JSON.stringify({ pages: shardPages }, null, 2) + '\n', 'utf8');
106
+ fs.writeFileSync(path.join(dir, `sel-${worker}.json`), JSON.stringify({ pages: shardPages, ...(unattributed.size > 0 ? { unattributed: [...unattributed].sort() } : {}) }, null, 2) + '\n', 'utf8');
99
107
  }
100
108
  catch {
101
109
  /* a failed shard write loses one worker's capture, never the test run */
@@ -121,8 +129,11 @@ async function capture(driver) {
121
129
  const resolved = (0, pageName_1.resolvePageName)(url, config());
122
130
  // Step-reached views share a URL, so a run-time capture cannot know which one
123
131
  // it is looking at — `map` stays the path for those.
124
- if (resolved.kind === 'steps')
132
+ if (resolved.kind === 'steps') {
133
+ for (const name of resolved.candidates)
134
+ unattributed.add(name);
125
135
  return;
136
+ }
126
137
  const elements = (await driver.executeScript(extract_1.extractInPage)) || [];
127
138
  if (elements.length === 0)
128
139
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/selenium/capture.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,wCAEC;AA4DD,0BAsBC;AApHD,uCAAyB;AACzB,2CAA6B;AAC7B,gDAAmD;AAEnD,sCAAmD;AACnD,0CAA0D;AAC1D,kDAA4D;AAE5D;;;;;;;;;;;;;;;;;;;;GAoBG;AAEU,QAAA,WAAW,GAAG,cAAc,CAAC;AAE1C,SAAgB,cAAc;IAC5B,OAAO,OAAO,CAAC,GAAG,CAAC,mBAAW,CAAC,KAAK,GAAG,CAAC;AAC1C,CAAC;AAYD,6DAA6D;AAC7D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoE,CAAC;AAC1F,IAAI,GAAG,GAAsB,IAAI,CAAC;AAClC,IAAI,SAAS,GAAG,KAAK,CAAC;AAEtB,SAAS,MAAM;IACb,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,IAAA,mBAAU,GAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO;QAC7B,MAAM,GAAG,GAAG,IAAA,yBAAU,GAAE,CAAC;QACzB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACpE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpD,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,GAAG,EAAE,CAAC,CAAC,GAAG;YACV,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,CAAC,CAAC,CAAC;QACJ,EAAE,CAAC,aAAa,CACd,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,MAAM,OAAO,CAAC,EACpC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACrD,MAAM,CACP,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;IAC3E,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACI,KAAK,UAAU,OAAO,CAAC,MAAwB;IACpD,IAAI,CAAC,cAAc,EAAE;QAAE,OAAO;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;QACzC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,aAAa;YAAE,OAAO;QAC1C,MAAM,QAAQ,GAAG,IAAA,0BAAe,EAAC,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QAChD,8EAA8E;QAC9E,qDAAqD;QACrD,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO;YAAE,OAAO;QACtC,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,aAAa,CAAkB,uBAAa,CAAC,CAAC,IAAI,EAAE,CAAC;QACpF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAClC,MAAM,GAAG,GAAG,IAAA,qBAAU,EAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;YACb,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,GAAG;YACH,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,IAAA,4BAAa,EAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;SACnE,CAAC,CAAC;QACH,UAAU,EAAE,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,4DAA4D;IAC9D,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/selenium/capture.ts"],"names":[],"mappings":"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"}