flakelab 0.1.0 → 0.1.2

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 (322) hide show
  1. package/README.md +225 -38
  2. package/dist/analysis/blob-report.d.ts +15 -0
  3. package/dist/analysis/blob-report.js +137 -0
  4. package/dist/analysis/blob-report.js.map +1 -0
  5. package/dist/analysis/cli.d.ts +7 -0
  6. package/dist/analysis/cli.js +28 -0
  7. package/dist/analysis/cli.js.map +1 -0
  8. package/dist/analysis/schema.d.ts +175 -0
  9. package/dist/analysis/schema.js +34 -0
  10. package/dist/analysis/schema.js.map +1 -0
  11. package/dist/analysis/zip-archive.d.ts +6 -0
  12. package/dist/analysis/zip-archive.js +193 -0
  13. package/dist/analysis/zip-archive.js.map +1 -0
  14. package/dist/artifacts/paths.d.ts +3 -0
  15. package/dist/artifacts/paths.js +34 -0
  16. package/dist/artifacts/paths.js.map +1 -0
  17. package/dist/artifacts/retention.d.ts +1 -0
  18. package/dist/artifacts/retention.js +80 -0
  19. package/dist/artifacts/retention.js.map +1 -0
  20. package/dist/bisect/engine.js +0 -1
  21. package/dist/bisect/engine.js.map +1 -1
  22. package/dist/bisect/schema.d.ts +5 -6
  23. package/dist/bisect/schema.js +1 -2
  24. package/dist/bisect/schema.js.map +1 -1
  25. package/dist/bisect/solari-evaluator.js +9 -1
  26. package/dist/bisect/solari-evaluator.js.map +1 -1
  27. package/dist/ci/job-summary.d.ts +2 -0
  28. package/dist/ci/job-summary.js +120 -2
  29. package/dist/ci/job-summary.js.map +1 -1
  30. package/dist/ci/select-command.js +1 -1
  31. package/dist/ci/select-command.js.map +1 -1
  32. package/dist/ci/summary-command.js +12 -7
  33. package/dist/ci/summary-command.js.map +1 -1
  34. package/dist/cli-arguments.d.ts +44 -0
  35. package/dist/cli-arguments.js +356 -0
  36. package/dist/cli-arguments.js.map +1 -0
  37. package/dist/cli-command-help.d.ts +11 -0
  38. package/dist/cli-command-help.js +211 -0
  39. package/dist/cli-command-help.js.map +1 -0
  40. package/dist/cli-help.d.ts +5 -2
  41. package/dist/cli-help.js +122 -45
  42. package/dist/cli-help.js.map +1 -1
  43. package/dist/cli-option-definitions.d.ts +202 -0
  44. package/dist/cli-option-definitions.js +59 -0
  45. package/dist/cli-option-definitions.js.map +1 -0
  46. package/dist/cli.js +100 -100
  47. package/dist/cli.js.map +1 -1
  48. package/dist/commands/analyze-summary.d.ts +5 -0
  49. package/dist/commands/analyze-summary.js +89 -0
  50. package/dist/commands/analyze-summary.js.map +1 -0
  51. package/dist/commands/analyze.d.ts +6 -0
  52. package/dist/commands/analyze.js +128 -0
  53. package/dist/commands/analyze.js.map +1 -0
  54. package/dist/commands/bisect.d.ts +2 -2
  55. package/dist/commands/bisect.js +32 -3
  56. package/dist/commands/bisect.js.map +1 -1
  57. package/dist/commands/diagnose.d.ts +3 -2
  58. package/dist/commands/diagnose.js +355 -23
  59. package/dist/commands/diagnose.js.map +1 -1
  60. package/dist/commands/discover.d.ts +18 -2
  61. package/dist/commands/discover.js +215 -25
  62. package/dist/commands/discover.js.map +1 -1
  63. package/dist/commands/doctor.d.ts +2 -0
  64. package/dist/commands/doctor.js +66 -25
  65. package/dist/commands/doctor.js.map +1 -1
  66. package/dist/commands/investigate.d.ts +3 -2
  67. package/dist/commands/investigate.js +22 -3
  68. package/dist/commands/investigate.js.map +1 -1
  69. package/dist/commands/options.d.ts +123 -16
  70. package/dist/commands/options.js +24 -2
  71. package/dist/commands/options.js.map +1 -1
  72. package/dist/commands/prove.d.ts +2 -2
  73. package/dist/commands/prove.js +38 -1
  74. package/dist/commands/prove.js.map +1 -1
  75. package/dist/commands/repair.d.ts +8 -2
  76. package/dist/commands/repair.js +32 -9
  77. package/dist/commands/repair.js.map +1 -1
  78. package/dist/commands/replay.d.ts +2 -2
  79. package/dist/commands/replay.js +15 -2
  80. package/dist/commands/replay.js.map +1 -1
  81. package/dist/commands/report.d.ts +2 -2
  82. package/dist/commands/report.js +35 -10
  83. package/dist/commands/report.js.map +1 -1
  84. package/dist/commands/scan-summary.d.ts +7 -0
  85. package/dist/commands/scan-summary.js +175 -0
  86. package/dist/commands/scan-summary.js.map +1 -0
  87. package/dist/commands/scan.d.ts +9 -12
  88. package/dist/commands/scan.js +66 -62
  89. package/dist/commands/scan.js.map +1 -1
  90. package/dist/core/plan.js +1 -1
  91. package/dist/core/plan.js.map +1 -1
  92. package/dist/diagnosis/checkpoint.d.ts +6 -0
  93. package/dist/diagnosis/checkpoint.js +46 -0
  94. package/dist/diagnosis/checkpoint.js.map +1 -0
  95. package/dist/diagnosis/cli.d.ts +7 -0
  96. package/dist/diagnosis/cli.js +84 -0
  97. package/dist/diagnosis/cli.js.map +1 -0
  98. package/dist/diagnosis/recommendation.d.ts +13 -0
  99. package/dist/diagnosis/recommendation.js +95 -0
  100. package/dist/diagnosis/recommendation.js.map +1 -0
  101. package/dist/diagnosis/run-state.d.ts +52 -0
  102. package/dist/diagnosis/run-state.js +173 -0
  103. package/dist/diagnosis/run-state.js.map +1 -0
  104. package/dist/diagnosis/schema.d.ts +207 -0
  105. package/dist/diagnosis/schema.js +108 -0
  106. package/dist/diagnosis/schema.js.map +1 -0
  107. package/dist/diagnosis/solari-handoff.d.ts +9 -0
  108. package/dist/diagnosis/solari-handoff.js +40 -0
  109. package/dist/diagnosis/solari-handoff.js.map +1 -0
  110. package/dist/diagnosis/summary.d.ts +3 -0
  111. package/dist/diagnosis/summary.js +115 -0
  112. package/dist/diagnosis/summary.js.map +1 -0
  113. package/dist/discovery/auth-cookie.d.ts +19 -0
  114. package/dist/discovery/auth-cookie.js +26 -0
  115. package/dist/discovery/auth-cookie.js.map +1 -0
  116. package/dist/discovery/evaluate.d.ts +35 -2
  117. package/dist/discovery/evaluate.js +136 -30
  118. package/dist/discovery/evaluate.js.map +1 -1
  119. package/dist/discovery/event-loop.d.ts +25 -0
  120. package/dist/discovery/event-loop.js +84 -0
  121. package/dist/discovery/event-loop.js.map +1 -0
  122. package/dist/discovery/minimize.d.ts +61 -1
  123. package/dist/discovery/minimize.js +179 -7
  124. package/dist/discovery/minimize.js.map +1 -1
  125. package/dist/discovery/resource-loading.d.ts +25 -0
  126. package/dist/discovery/resource-loading.js +84 -0
  127. package/dist/discovery/resource-loading.js.map +1 -0
  128. package/dist/discovery/runner-environment.d.ts +26 -0
  129. package/dist/discovery/runner-environment.js +68 -0
  130. package/dist/discovery/runner-environment.js.map +1 -0
  131. package/dist/discovery/startup-event.d.ts +25 -0
  132. package/dist/discovery/startup-event.js +84 -0
  133. package/dist/discovery/startup-event.js.map +1 -0
  134. package/dist/discovery/storage-state.d.ts +26 -0
  135. package/dist/discovery/storage-state.js +86 -0
  136. package/dist/discovery/storage-state.js.map +1 -0
  137. package/dist/discovery/temporal-environment.d.ts +31 -0
  138. package/dist/discovery/temporal-environment.js +43 -0
  139. package/dist/discovery/temporal-environment.js.map +1 -0
  140. package/dist/discovery/visual-environment.d.ts +28 -0
  141. package/dist/discovery/visual-environment.js +42 -0
  142. package/dist/discovery/visual-environment.js.map +1 -0
  143. package/dist/domain/schema.d.ts +840 -20
  144. package/dist/domain/schema.js +216 -6
  145. package/dist/domain/schema.js.map +1 -1
  146. package/dist/faults/browser-context.d.ts +16 -0
  147. package/dist/faults/browser-context.js +60 -0
  148. package/dist/faults/browser-context.js.map +1 -0
  149. package/dist/faults/cookie-header.d.ts +5 -0
  150. package/dist/faults/cookie-header.js +25 -0
  151. package/dist/faults/cookie-header.js.map +1 -0
  152. package/dist/faults/document-bootstrap.d.ts +5 -0
  153. package/dist/faults/document-bootstrap.js +141 -0
  154. package/dist/faults/document-bootstrap.js.map +1 -0
  155. package/dist/faults/install.d.ts +1 -1
  156. package/dist/faults/install.js +199 -6
  157. package/dist/faults/install.js.map +1 -1
  158. package/dist/faults/pattern.d.ts +1 -0
  159. package/dist/faults/pattern.js +24 -0
  160. package/dist/faults/pattern.js.map +1 -0
  161. package/dist/investigator/agent.js +39 -17
  162. package/dist/investigator/agent.js.map +1 -1
  163. package/dist/investigator/ledger.d.ts +1 -1
  164. package/dist/investigator/ledger.js +2 -2
  165. package/dist/investigator/ledger.js.map +1 -1
  166. package/dist/investigator/safe-source.d.ts +1 -0
  167. package/dist/investigator/safe-source.js +12 -3
  168. package/dist/investigator/safe-source.js.map +1 -1
  169. package/dist/investigator/schema.d.ts +293 -2
  170. package/dist/investigator/schema.js +100 -2
  171. package/dist/investigator/schema.js.map +1 -1
  172. package/dist/proof/cli.d.ts +7 -0
  173. package/dist/proof/cli.js +108 -0
  174. package/dist/proof/cli.js.map +1 -0
  175. package/dist/proof/preflight.d.ts +4 -0
  176. package/dist/proof/preflight.js +9 -0
  177. package/dist/proof/preflight.js.map +1 -0
  178. package/dist/repair/generator.d.ts +12 -1
  179. package/dist/repair/generator.js +30 -6
  180. package/dist/repair/generator.js.map +1 -1
  181. package/dist/repair/remote-proof-runner.js +6 -10
  182. package/dist/repair/remote-proof-runner.js.map +1 -1
  183. package/dist/repair/schema.d.ts +77 -2
  184. package/dist/repair/schema.js +23 -2
  185. package/dist/repair/schema.js.map +1 -1
  186. package/dist/repair/solari-validator.d.ts +2 -0
  187. package/dist/repair/solari-validator.js +4 -6
  188. package/dist/repair/solari-validator.js.map +1 -1
  189. package/dist/repair/summary.d.ts +10 -0
  190. package/dist/repair/summary.js +58 -0
  191. package/dist/repair/summary.js.map +1 -0
  192. package/dist/repair/validator.d.ts +1 -0
  193. package/dist/repair/validator.js +53 -12
  194. package/dist/repair/validator.js.map +1 -1
  195. package/dist/report/bundle.js +16 -37
  196. package/dist/report/bundle.js.map +1 -1
  197. package/dist/report/model.js +131 -12
  198. package/dist/report/model.js.map +1 -1
  199. package/dist/report/open.d.ts +9 -0
  200. package/dist/report/open.js +23 -0
  201. package/dist/report/open.js.map +1 -1
  202. package/dist/report/report-client.css +2 -0
  203. package/dist/report/report-client.js +58 -0
  204. package/dist/report/schema.d.ts +115 -5
  205. package/dist/report/schema.js +24 -5
  206. package/dist/report/schema.js.map +1 -1
  207. package/dist/reproducer/schema.d.ts +89 -4
  208. package/dist/reproducer/schema.js +3 -4
  209. package/dist/reproducer/schema.js.map +1 -1
  210. package/dist/runner/execution-fault.d.ts +10 -0
  211. package/dist/runner/execution-fault.js +24 -0
  212. package/dist/runner/execution-fault.js.map +1 -0
  213. package/dist/runner/fault-proxy.d.ts +7 -0
  214. package/dist/runner/fault-proxy.js +366 -0
  215. package/dist/runner/fault-proxy.js.map +1 -0
  216. package/dist/runner/local.js +2 -2
  217. package/dist/runner/local.js.map +1 -1
  218. package/dist/runner/native-scan.d.ts +25 -0
  219. package/dist/runner/native-scan.js +306 -0
  220. package/dist/runner/native-scan.js.map +1 -0
  221. package/dist/runner/playwright-executor.d.ts +3 -0
  222. package/dist/runner/playwright-executor.js +125 -66
  223. package/dist/runner/playwright-executor.js.map +1 -1
  224. package/dist/runner/process-tree.d.ts +7 -0
  225. package/dist/runner/process-tree.js +62 -0
  226. package/dist/runner/process-tree.js.map +1 -0
  227. package/dist/runner/project-bridge.d.ts +7 -0
  228. package/dist/runner/project-bridge.js +83 -0
  229. package/dist/runner/project-bridge.js.map +1 -0
  230. package/dist/runner/trial-reporter.d.ts +7 -0
  231. package/dist/runner/trial-reporter.js +47 -0
  232. package/dist/runner/trial-reporter.js.map +1 -0
  233. package/dist/scan/failure-clusters.d.ts +24 -0
  234. package/dist/scan/failure-clusters.js +74 -0
  235. package/dist/scan/failure-clusters.js.map +1 -0
  236. package/dist/scan/schema.d.ts +170 -0
  237. package/dist/scan/schema.js +71 -0
  238. package/dist/scan/schema.js.map +1 -0
  239. package/dist/solari/executor.d.ts +5 -1
  240. package/dist/solari/executor.js +25 -17
  241. package/dist/solari/executor.js.map +1 -1
  242. package/dist/solari/run-demo.d.ts +13 -1
  243. package/dist/solari/run-demo.js +35 -16
  244. package/dist/solari/run-demo.js.map +1 -1
  245. package/dist/solari/usage.d.ts +8 -2
  246. package/dist/solari/usage.js +14 -4
  247. package/dist/solari/usage.js.map +1 -1
  248. package/dist/ui/boundary.d.ts +17 -0
  249. package/dist/ui/boundary.js +18 -0
  250. package/dist/ui/boundary.js.map +1 -0
  251. package/dist/ui/console.d.ts +4 -0
  252. package/dist/ui/console.js +11 -0
  253. package/dist/ui/console.js.map +1 -0
  254. package/dist/ui/document.d.ts +40 -0
  255. package/dist/ui/document.js +120 -0
  256. package/dist/ui/document.js.map +1 -0
  257. package/dist/ui/format.d.ts +8 -0
  258. package/dist/ui/format.js +32 -0
  259. package/dist/ui/format.js.map +1 -0
  260. package/dist/ui/progress.d.ts +17 -1
  261. package/dist/ui/progress.js +51 -8
  262. package/dist/ui/progress.js.map +1 -1
  263. package/dist/ui/status.d.ts +7 -0
  264. package/dist/ui/status.js +36 -0
  265. package/dist/ui/status.js.map +1 -0
  266. package/dist/ui/style.d.ts +8 -0
  267. package/dist/ui/style.js +22 -0
  268. package/dist/ui/style.js.map +1 -0
  269. package/dist/ui/text.d.ts +17 -0
  270. package/dist/ui/text.js +123 -0
  271. package/dist/ui/text.js.map +1 -0
  272. package/dist/ui/theme.d.ts +23 -0
  273. package/dist/ui/theme.js +77 -0
  274. package/dist/ui/theme.js.map +1 -0
  275. package/dist/ui/trial-progress.d.ts +13 -0
  276. package/dist/ui/trial-progress.js +42 -0
  277. package/dist/ui/trial-progress.js.map +1 -0
  278. package/package.json +14 -19
  279. package/dist/faults/network-delay.d.ts +0 -5
  280. package/dist/faults/network-delay.js +0 -34
  281. package/dist/faults/network-delay.js.map +0 -1
  282. package/dist/faults/request-failure.d.ts +0 -5
  283. package/dist/faults/request-failure.js +0 -24
  284. package/dist/faults/request-failure.js.map +0 -1
  285. package/dist/playwright.d.ts +0 -3
  286. package/dist/playwright.js +0 -21
  287. package/dist/playwright.js.map +0 -1
  288. package/dist/report/browser-entry.d.ts +0 -2
  289. package/dist/report/browser-entry.js +0 -15
  290. package/dist/report/browser-entry.js.map +0 -1
  291. package/dist/report/components/artifacts.d.ts +0 -4
  292. package/dist/report/components/artifacts.js +0 -6
  293. package/dist/report/components/artifacts.js.map +0 -1
  294. package/dist/report/components/experiments.d.ts +0 -4
  295. package/dist/report/components/experiments.js +0 -7
  296. package/dist/report/components/experiments.js.map +0 -1
  297. package/dist/report/components/hypotheses.d.ts +0 -4
  298. package/dist/report/components/hypotheses.js +0 -26
  299. package/dist/report/components/hypotheses.js.map +0 -1
  300. package/dist/report/components/indicators.d.ts +0 -32
  301. package/dist/report/components/indicators.js +0 -42
  302. package/dist/report/components/indicators.js.map +0 -1
  303. package/dist/report/components/layout.d.ts +0 -29
  304. package/dist/report/components/layout.js +0 -20
  305. package/dist/report/components/layout.js.map +0 -1
  306. package/dist/report/components/proof.d.ts +0 -4
  307. package/dist/report/components/proof.js +0 -34
  308. package/dist/report/components/proof.js.map +0 -1
  309. package/dist/report/components/reproduction.d.ts +0 -4
  310. package/dist/report/components/reproduction.js +0 -19
  311. package/dist/report/components/reproduction.js.map +0 -1
  312. package/dist/report/components/summary.d.ts +0 -4
  313. package/dist/report/components/summary.js +0 -12
  314. package/dist/report/components/summary.js.map +0 -1
  315. package/dist/report/components/verdict.d.ts +0 -4
  316. package/dist/report/components/verdict.js +0 -27
  317. package/dist/report/components/verdict.js.map +0 -1
  318. package/dist/report/report-app.d.ts +0 -6
  319. package/dist/report/report-app.js +0 -16
  320. package/dist/report/report-app.js.map +0 -1
  321. package/dist/report/report-details.css +0 -182
  322. package/dist/report/report.css +0 -404
@@ -0,0 +1,84 @@
1
+ import { createCausalEvaluator } from "./evaluate.js";
2
+ const MINIMUM_CONFIRMATION_TRIALS = 12;
3
+ async function confirmBoundary(experiments, minimumDelayMs, evaluateDelay, confirmationTrials) {
4
+ const candidates = [...new Set(experiments
5
+ .filter((entry) => entry.delayMs >= minimumDelayMs && entry.result.confirmed)
6
+ .map((entry) => entry.delayMs))]
7
+ .sort((left, right) => left - right);
8
+ for (const delayMs of candidates) {
9
+ const result = await evaluateDelay(delayMs, confirmationTrials);
10
+ if (result.confirmed) {
11
+ return { delayMs, result };
12
+ }
13
+ }
14
+ throw new Error("No startup event delay reproduced the failure in two independent batches");
15
+ }
16
+ async function confirmStableTrigger(minimumDelayMs, maximumDelayMs, evaluateDelay, confirmationTrials) {
17
+ const delayMs = Math.ceil((minimumDelayMs + maximumDelayMs) / 2);
18
+ const result = await evaluateDelay(delayMs, confirmationTrials);
19
+ if (result.confirmed) {
20
+ return { delayMs, result };
21
+ }
22
+ if (delayMs === maximumDelayMs) {
23
+ throw new Error("No stable startup event reproducer was found within the configured bound");
24
+ }
25
+ const maximumResult = await evaluateDelay(maximumDelayMs, confirmationTrials);
26
+ if (!maximumResult.confirmed) {
27
+ throw new Error("No stable startup event reproducer was found within the configured bound");
28
+ }
29
+ return { delayMs: maximumDelayMs, result: maximumResult };
30
+ }
31
+ export async function discoverStartupEventDelay(execute, options) {
32
+ const common = {
33
+ concurrency: options.concurrency,
34
+ minimumFailureRate: options.minimumFailureRate,
35
+ seed: options.seed,
36
+ signal: options.signal,
37
+ trials: options.trials,
38
+ };
39
+ const evaluator = createCausalEvaluator(execute, common);
40
+ const experiments = [];
41
+ const evaluateDelay = async (delayMs, trials = options.trials) => {
42
+ const fault = {
43
+ kind: "startup-event-delay",
44
+ delayMs,
45
+ event: options.event,
46
+ pattern: options.pattern,
47
+ };
48
+ const result = await evaluator.evaluate([fault], trials);
49
+ experiments.push({ delayMs, result });
50
+ return result;
51
+ };
52
+ const maximum = await evaluateDelay(options.maximumDelayMs);
53
+ if (!maximum.confirmed) {
54
+ throw new Error("Maximum startup event delay did not reproduce the failure confidently");
55
+ }
56
+ let passingDelayMs = 0;
57
+ let failingDelayMs = options.maximumDelayMs;
58
+ while (failingDelayMs - passingDelayMs > 1) {
59
+ const candidate = Math.floor((passingDelayMs + failingDelayMs) / 2);
60
+ const result = await evaluateDelay(candidate);
61
+ if (result.confirmed) {
62
+ failingDelayMs = candidate;
63
+ }
64
+ else {
65
+ passingDelayMs = candidate;
66
+ }
67
+ }
68
+ const confirmationTrials = Math.max(options.trials, MINIMUM_CONFIRMATION_TRIALS);
69
+ const minimum = await confirmBoundary(experiments, failingDelayMs, evaluateDelay, confirmationTrials);
70
+ const stable = await confirmStableTrigger(minimum.delayMs, options.maximumDelayMs, evaluateDelay, confirmationTrials);
71
+ return {
72
+ baseline: evaluator.baseline(),
73
+ experiments,
74
+ minimumDelayMs: minimum.delayMs,
75
+ trigger: {
76
+ kind: "startup-event-delay",
77
+ delayMs: stable.delayMs,
78
+ event: options.event,
79
+ pattern: options.pattern,
80
+ },
81
+ triggerResult: stable.result,
82
+ };
83
+ }
84
+ //# sourceMappingURL=startup-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-event.js","sourceRoot":"","sources":["../../src/discovery/startup-event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { BrowserStorageArea, StorageStateDelayFault } from "../domain/schema.js";
2
+ import type { TrialExecutor } from "../runner/playwright-executor.js";
3
+ import type { ExperimentResult } from "./evaluate.js";
4
+ export interface StorageStateDiscoveryOptions {
5
+ concurrency: number;
6
+ key: string;
7
+ maximumDelayMs: number;
8
+ minimumFailureRate: number;
9
+ pattern: string;
10
+ seed: number;
11
+ signal?: AbortSignal;
12
+ storage: BrowserStorageArea;
13
+ trials: number;
14
+ }
15
+ export interface StorageStateExperiment {
16
+ delayMs: number;
17
+ result: ExperimentResult;
18
+ }
19
+ export interface StorageStateDiscoveryResult {
20
+ baseline: ExperimentResult;
21
+ experiments: StorageStateExperiment[];
22
+ minimumDelayMs: number;
23
+ trigger: StorageStateDelayFault;
24
+ triggerResult: ExperimentResult;
25
+ }
26
+ export declare function discoverStorageStateDelay(execute: TrialExecutor, options: StorageStateDiscoveryOptions): Promise<StorageStateDiscoveryResult>;
@@ -0,0 +1,86 @@
1
+ import { createCausalEvaluator } from "./evaluate.js";
2
+ const MINIMUM_CONFIRMATION_TRIALS = 12;
3
+ async function confirmBoundary(experiments, minimumDelayMs, evaluateDelay, confirmationTrials) {
4
+ const candidates = [...new Set(experiments
5
+ .filter((entry) => entry.delayMs >= minimumDelayMs && entry.result.confirmed)
6
+ .map((entry) => entry.delayMs))]
7
+ .sort((left, right) => left - right);
8
+ for (const delayMs of candidates) {
9
+ const result = await evaluateDelay(delayMs, confirmationTrials);
10
+ if (result.confirmed) {
11
+ return { delayMs, result };
12
+ }
13
+ }
14
+ throw new Error("No storage-state delay reproduced the failure in two independent batches");
15
+ }
16
+ async function confirmStableTrigger(minimumDelayMs, maximumDelayMs, evaluateDelay, confirmationTrials) {
17
+ const delayMs = Math.ceil((minimumDelayMs + maximumDelayMs) / 2);
18
+ const result = await evaluateDelay(delayMs, confirmationTrials);
19
+ if (result.confirmed) {
20
+ return { delayMs, result };
21
+ }
22
+ if (delayMs === maximumDelayMs) {
23
+ throw new Error("No stable storage-state delay reproducer was found within the configured bound");
24
+ }
25
+ const maximumResult = await evaluateDelay(maximumDelayMs, confirmationTrials);
26
+ if (!maximumResult.confirmed) {
27
+ throw new Error("No stable storage-state delay reproducer was found within the configured bound");
28
+ }
29
+ return { delayMs: maximumDelayMs, result: maximumResult };
30
+ }
31
+ export async function discoverStorageStateDelay(execute, options) {
32
+ const common = {
33
+ concurrency: options.concurrency,
34
+ minimumFailureRate: options.minimumFailureRate,
35
+ seed: options.seed,
36
+ signal: options.signal,
37
+ trials: options.trials,
38
+ };
39
+ const evaluator = createCausalEvaluator(execute, common);
40
+ const experiments = [];
41
+ const evaluateDelay = async (delayMs, trials = options.trials) => {
42
+ const fault = {
43
+ kind: "storage-state-delay",
44
+ delayMs,
45
+ key: options.key,
46
+ pattern: options.pattern,
47
+ storage: options.storage,
48
+ };
49
+ const result = await evaluator.evaluate([fault], trials);
50
+ experiments.push({ delayMs, result });
51
+ return result;
52
+ };
53
+ const maximum = await evaluateDelay(options.maximumDelayMs);
54
+ if (!maximum.confirmed) {
55
+ throw new Error("Maximum storage-state delay did not reproduce the failure confidently");
56
+ }
57
+ let passingDelayMs = 0;
58
+ let failingDelayMs = options.maximumDelayMs;
59
+ while (failingDelayMs - passingDelayMs > 1) {
60
+ const candidate = Math.floor((passingDelayMs + failingDelayMs) / 2);
61
+ const result = await evaluateDelay(candidate);
62
+ if (result.confirmed) {
63
+ failingDelayMs = candidate;
64
+ }
65
+ else {
66
+ passingDelayMs = candidate;
67
+ }
68
+ }
69
+ const confirmationTrials = Math.max(options.trials, MINIMUM_CONFIRMATION_TRIALS);
70
+ const minimum = await confirmBoundary(experiments, failingDelayMs, evaluateDelay, confirmationTrials);
71
+ const stable = await confirmStableTrigger(minimum.delayMs, options.maximumDelayMs, evaluateDelay, confirmationTrials);
72
+ return {
73
+ baseline: evaluator.baseline(),
74
+ experiments,
75
+ minimumDelayMs: minimum.delayMs,
76
+ trigger: {
77
+ kind: "storage-state-delay",
78
+ delayMs: stable.delayMs,
79
+ key: options.key,
80
+ pattern: options.pattern,
81
+ storage: options.storage,
82
+ },
83
+ triggerResult: stable.result,
84
+ };
85
+ }
86
+ //# sourceMappingURL=storage-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-state.js","sourceRoot":"","sources":["../../src/discovery/storage-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ClockJumpFault, Fault, LocaleFault, TimezoneFault } from "../domain/schema.js";
2
+ import type { TrialExecutor } from "../runner/playwright-executor.js";
3
+ import type { ExperimentResult } from "./evaluate.js";
4
+ interface TemporalDiscoveryOptions {
5
+ concurrency: number;
6
+ minimumFailureRate: number;
7
+ pattern: string;
8
+ seed: number;
9
+ signal?: AbortSignal;
10
+ trials: number;
11
+ }
12
+ export interface ClockJumpDiscoveryOptions extends TemporalDiscoveryOptions {
13
+ jumpAfterMs: number;
14
+ offsetMs: number;
15
+ }
16
+ export interface LocaleDiscoveryOptions extends TemporalDiscoveryOptions {
17
+ locale: string;
18
+ }
19
+ export interface TimezoneDiscoveryOptions extends TemporalDiscoveryOptions {
20
+ timezoneId: string;
21
+ }
22
+ export interface TemporalDiscoveryResult<T extends Fault> {
23
+ baseline: ExperimentResult;
24
+ experiments: ExperimentResult[];
25
+ trigger: T;
26
+ triggerResult: ExperimentResult;
27
+ }
28
+ export declare function discoverClockJump(execute: TrialExecutor, options: ClockJumpDiscoveryOptions): Promise<TemporalDiscoveryResult<ClockJumpFault>>;
29
+ export declare function discoverLocale(execute: TrialExecutor, options: LocaleDiscoveryOptions): Promise<TemporalDiscoveryResult<LocaleFault>>;
30
+ export declare function discoverTimezone(execute: TrialExecutor, options: TimezoneDiscoveryOptions): Promise<TemporalDiscoveryResult<TimezoneFault>>;
31
+ export {};
@@ -0,0 +1,43 @@
1
+ import { createCausalEvaluator } from "./evaluate.js";
2
+ const MINIMUM_CONFIRMATION_TRIALS = 12;
3
+ async function confirmTemporalFault(execute, options, trigger, label) {
4
+ const common = {
5
+ concurrency: options.concurrency,
6
+ minimumFailureRate: options.minimumFailureRate,
7
+ seed: options.seed,
8
+ signal: options.signal,
9
+ };
10
+ const evaluator = createCausalEvaluator(execute, { ...common, trials: options.trials });
11
+ const first = await evaluator.evaluate([trigger]);
12
+ if (!first.confirmed) {
13
+ throw new Error(`${label} did not reproduce the failure confidently`);
14
+ }
15
+ const triggerResult = await evaluator.evaluate([trigger], Math.max(options.trials, MINIMUM_CONFIRMATION_TRIALS));
16
+ if (!triggerResult.confirmed) {
17
+ throw new Error(`${label} did not reproduce in an independent confirmation batch`);
18
+ }
19
+ return { baseline: evaluator.baseline(), experiments: [first, triggerResult], trigger, triggerResult };
20
+ }
21
+ export function discoverClockJump(execute, options) {
22
+ return confirmTemporalFault(execute, options, {
23
+ kind: "clock-jump",
24
+ jumpAfterMs: options.jumpAfterMs,
25
+ offsetMs: options.offsetMs,
26
+ pattern: options.pattern,
27
+ }, "Clock jump");
28
+ }
29
+ export function discoverLocale(execute, options) {
30
+ return confirmTemporalFault(execute, options, {
31
+ kind: "locale",
32
+ locale: options.locale,
33
+ pattern: options.pattern,
34
+ }, "Locale change");
35
+ }
36
+ export function discoverTimezone(execute, options) {
37
+ return confirmTemporalFault(execute, options, {
38
+ kind: "timezone",
39
+ pattern: options.pattern,
40
+ timezoneId: options.timezoneId,
41
+ }, "Timezone change");
42
+ }
43
+ //# sourceMappingURL=temporal-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal-environment.js","sourceRoot":"","sources":["../../src/discovery/temporal-environment.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,MAAM,2BAA2B,GAAG,EAAE,CAAA;AA+BtC,KAAK,UAAU,oBAAoB,CACjC,OAAsB,EACtB,OAAiC,EACjC,OAAU,EACV,KAAa;IAEb,MAAM,MAAM,GAAG;QACb,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAA;IACD,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACvF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IACjD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,4CAA4C,CAAC,CAAA;IACvE,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,QAAQ,CAC5C,CAAC,OAAO,CAAC,EACT,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,CAAC,CACtD,CAAA;IACD,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yDAAyD,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAA;AACxG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAsB,EACtB,OAAkC;IAElC,OAAO,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE;QAC5C,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,EAAE,YAAY,CAAC,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAAsB,EACtB,OAA+B;IAE/B,OAAO,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE;QAC5C,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,EAAE,eAAe,CAAC,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAsB,EACtB,OAAiC;IAEjC,OAAO,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE;QAC5C,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,EAAE,iBAAiB,CAAC,CAAA;AACvB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { AnimationSpeedFault, Fault, ReducedMotionFault, ViewportFault } from "../domain/schema.js";
2
+ import type { TrialExecutor } from "../runner/playwright-executor.js";
3
+ import type { ExperimentResult } from "./evaluate.js";
4
+ interface VisualDiscoveryOptions {
5
+ concurrency: number;
6
+ minimumFailureRate: number;
7
+ pattern: string;
8
+ seed: number;
9
+ signal?: AbortSignal;
10
+ trials: number;
11
+ }
12
+ export interface AnimationSpeedDiscoveryOptions extends VisualDiscoveryOptions {
13
+ rate: number;
14
+ }
15
+ export interface ViewportDiscoveryOptions extends VisualDiscoveryOptions {
16
+ height: number;
17
+ width: number;
18
+ }
19
+ export interface VisualDiscoveryResult<T extends Fault> {
20
+ baseline: ExperimentResult;
21
+ experiments: ExperimentResult[];
22
+ trigger: T;
23
+ triggerResult: ExperimentResult;
24
+ }
25
+ export declare function discoverAnimationSpeed(execute: TrialExecutor, options: AnimationSpeedDiscoveryOptions): Promise<VisualDiscoveryResult<AnimationSpeedFault>>;
26
+ export declare function discoverReducedMotion(execute: TrialExecutor, options: VisualDiscoveryOptions): Promise<VisualDiscoveryResult<ReducedMotionFault>>;
27
+ export declare function discoverViewport(execute: TrialExecutor, options: ViewportDiscoveryOptions): Promise<VisualDiscoveryResult<ViewportFault>>;
28
+ export {};
@@ -0,0 +1,42 @@
1
+ import { createCausalEvaluator } from "./evaluate.js";
2
+ const MINIMUM_CONFIRMATION_TRIALS = 12;
3
+ async function confirmVisualFault(execute, options, trigger, label) {
4
+ const common = {
5
+ concurrency: options.concurrency,
6
+ minimumFailureRate: options.minimumFailureRate,
7
+ seed: options.seed,
8
+ signal: options.signal,
9
+ };
10
+ const evaluator = createCausalEvaluator(execute, { ...common, trials: options.trials });
11
+ const first = await evaluator.evaluate([trigger]);
12
+ if (!first.confirmed) {
13
+ throw new Error(`${label} did not reproduce the failure confidently`);
14
+ }
15
+ const triggerResult = await evaluator.evaluate([trigger], Math.max(options.trials, MINIMUM_CONFIRMATION_TRIALS));
16
+ if (!triggerResult.confirmed) {
17
+ throw new Error(`${label} did not reproduce in an independent confirmation batch`);
18
+ }
19
+ return { baseline: evaluator.baseline(), experiments: [first, triggerResult], trigger, triggerResult };
20
+ }
21
+ export function discoverAnimationSpeed(execute, options) {
22
+ return confirmVisualFault(execute, options, {
23
+ kind: "animation-speed",
24
+ pattern: options.pattern,
25
+ rate: options.rate,
26
+ }, "Animation speed");
27
+ }
28
+ export function discoverReducedMotion(execute, options) {
29
+ return confirmVisualFault(execute, options, {
30
+ kind: "reduced-motion",
31
+ pattern: options.pattern,
32
+ }, "Reduced motion");
33
+ }
34
+ export function discoverViewport(execute, options) {
35
+ return confirmVisualFault(execute, options, {
36
+ height: options.height,
37
+ kind: "viewport",
38
+ pattern: options.pattern,
39
+ width: options.width,
40
+ }, "Viewport change");
41
+ }
42
+ //# sourceMappingURL=visual-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"visual-environment.js","sourceRoot":"","sources":["../../src/discovery/visual-environment.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,MAAM,2BAA2B,GAAG,EAAE,CAAA;AA2BtC,KAAK,UAAU,kBAAkB,CAC/B,OAAsB,EACtB,OAA+B,EAC/B,OAAU,EACV,KAAa;IAEb,MAAM,MAAM,GAAG;QACb,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;QAC9C,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAA;IACD,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,EAAE,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACvF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;IACjD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,4CAA4C,CAAC,CAAA;IACvE,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,SAAS,CAAC,QAAQ,CAC5C,CAAC,OAAO,CAAC,EACT,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,CAAC,CACtD,CAAA;IACD,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,yDAAyD,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,aAAa,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAA;AACxG,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAsB,EACtB,OAAuC;IAEvC,OAAO,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE;QAC1C,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,EAAE,iBAAiB,CAAC,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAAsB,EACtB,OAA+B;IAE/B,OAAO,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE;QAC1C,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,EAAE,gBAAgB,CAAC,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAsB,EACtB,OAAiC;IAEjC,OAAO,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE;QAC1C,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;KACrB,EAAE,iBAAiB,CAAC,CAAA;AACvB,CAAC"}