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.
- package/README.md +225 -38
- package/dist/analysis/blob-report.d.ts +15 -0
- package/dist/analysis/blob-report.js +137 -0
- package/dist/analysis/blob-report.js.map +1 -0
- package/dist/analysis/cli.d.ts +7 -0
- package/dist/analysis/cli.js +28 -0
- package/dist/analysis/cli.js.map +1 -0
- package/dist/analysis/schema.d.ts +175 -0
- package/dist/analysis/schema.js +34 -0
- package/dist/analysis/schema.js.map +1 -0
- package/dist/analysis/zip-archive.d.ts +6 -0
- package/dist/analysis/zip-archive.js +193 -0
- package/dist/analysis/zip-archive.js.map +1 -0
- package/dist/artifacts/paths.d.ts +3 -0
- package/dist/artifacts/paths.js +34 -0
- package/dist/artifacts/paths.js.map +1 -0
- package/dist/artifacts/retention.d.ts +1 -0
- package/dist/artifacts/retention.js +80 -0
- package/dist/artifacts/retention.js.map +1 -0
- package/dist/bisect/engine.js +0 -1
- package/dist/bisect/engine.js.map +1 -1
- package/dist/bisect/schema.d.ts +5 -6
- package/dist/bisect/schema.js +1 -2
- package/dist/bisect/schema.js.map +1 -1
- package/dist/bisect/solari-evaluator.js +9 -1
- package/dist/bisect/solari-evaluator.js.map +1 -1
- package/dist/ci/job-summary.d.ts +2 -0
- package/dist/ci/job-summary.js +120 -2
- package/dist/ci/job-summary.js.map +1 -1
- package/dist/ci/select-command.js +1 -1
- package/dist/ci/select-command.js.map +1 -1
- package/dist/ci/summary-command.js +12 -7
- package/dist/ci/summary-command.js.map +1 -1
- package/dist/cli-arguments.d.ts +44 -0
- package/dist/cli-arguments.js +356 -0
- package/dist/cli-arguments.js.map +1 -0
- package/dist/cli-command-help.d.ts +11 -0
- package/dist/cli-command-help.js +211 -0
- package/dist/cli-command-help.js.map +1 -0
- package/dist/cli-help.d.ts +5 -2
- package/dist/cli-help.js +122 -45
- package/dist/cli-help.js.map +1 -1
- package/dist/cli-option-definitions.d.ts +202 -0
- package/dist/cli-option-definitions.js +59 -0
- package/dist/cli-option-definitions.js.map +1 -0
- package/dist/cli.js +100 -100
- package/dist/cli.js.map +1 -1
- package/dist/commands/analyze-summary.d.ts +5 -0
- package/dist/commands/analyze-summary.js +89 -0
- package/dist/commands/analyze-summary.js.map +1 -0
- package/dist/commands/analyze.d.ts +6 -0
- package/dist/commands/analyze.js +128 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/bisect.d.ts +2 -2
- package/dist/commands/bisect.js +32 -3
- package/dist/commands/bisect.js.map +1 -1
- package/dist/commands/diagnose.d.ts +3 -2
- package/dist/commands/diagnose.js +355 -23
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/discover.d.ts +18 -2
- package/dist/commands/discover.js +215 -25
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +66 -25
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/investigate.d.ts +3 -2
- package/dist/commands/investigate.js +22 -3
- package/dist/commands/investigate.js.map +1 -1
- package/dist/commands/options.d.ts +123 -16
- package/dist/commands/options.js +24 -2
- package/dist/commands/options.js.map +1 -1
- package/dist/commands/prove.d.ts +2 -2
- package/dist/commands/prove.js +38 -1
- package/dist/commands/prove.js.map +1 -1
- package/dist/commands/repair.d.ts +8 -2
- package/dist/commands/repair.js +32 -9
- package/dist/commands/repair.js.map +1 -1
- package/dist/commands/replay.d.ts +2 -2
- package/dist/commands/replay.js +15 -2
- package/dist/commands/replay.js.map +1 -1
- package/dist/commands/report.d.ts +2 -2
- package/dist/commands/report.js +35 -10
- package/dist/commands/report.js.map +1 -1
- package/dist/commands/scan-summary.d.ts +7 -0
- package/dist/commands/scan-summary.js +175 -0
- package/dist/commands/scan-summary.js.map +1 -0
- package/dist/commands/scan.d.ts +9 -12
- package/dist/commands/scan.js +66 -62
- package/dist/commands/scan.js.map +1 -1
- package/dist/core/plan.js +1 -1
- package/dist/core/plan.js.map +1 -1
- package/dist/diagnosis/checkpoint.d.ts +6 -0
- package/dist/diagnosis/checkpoint.js +46 -0
- package/dist/diagnosis/checkpoint.js.map +1 -0
- package/dist/diagnosis/cli.d.ts +7 -0
- package/dist/diagnosis/cli.js +84 -0
- package/dist/diagnosis/cli.js.map +1 -0
- package/dist/diagnosis/recommendation.d.ts +13 -0
- package/dist/diagnosis/recommendation.js +95 -0
- package/dist/diagnosis/recommendation.js.map +1 -0
- package/dist/diagnosis/run-state.d.ts +52 -0
- package/dist/diagnosis/run-state.js +173 -0
- package/dist/diagnosis/run-state.js.map +1 -0
- package/dist/diagnosis/schema.d.ts +207 -0
- package/dist/diagnosis/schema.js +108 -0
- package/dist/diagnosis/schema.js.map +1 -0
- package/dist/diagnosis/solari-handoff.d.ts +9 -0
- package/dist/diagnosis/solari-handoff.js +40 -0
- package/dist/diagnosis/solari-handoff.js.map +1 -0
- package/dist/diagnosis/summary.d.ts +3 -0
- package/dist/diagnosis/summary.js +115 -0
- package/dist/diagnosis/summary.js.map +1 -0
- package/dist/discovery/auth-cookie.d.ts +19 -0
- package/dist/discovery/auth-cookie.js +26 -0
- package/dist/discovery/auth-cookie.js.map +1 -0
- package/dist/discovery/evaluate.d.ts +35 -2
- package/dist/discovery/evaluate.js +136 -30
- package/dist/discovery/evaluate.js.map +1 -1
- package/dist/discovery/event-loop.d.ts +25 -0
- package/dist/discovery/event-loop.js +84 -0
- package/dist/discovery/event-loop.js.map +1 -0
- package/dist/discovery/minimize.d.ts +61 -1
- package/dist/discovery/minimize.js +179 -7
- package/dist/discovery/minimize.js.map +1 -1
- package/dist/discovery/resource-loading.d.ts +25 -0
- package/dist/discovery/resource-loading.js +84 -0
- package/dist/discovery/resource-loading.js.map +1 -0
- package/dist/discovery/runner-environment.d.ts +26 -0
- package/dist/discovery/runner-environment.js +68 -0
- package/dist/discovery/runner-environment.js.map +1 -0
- package/dist/discovery/startup-event.d.ts +25 -0
- package/dist/discovery/startup-event.js +84 -0
- package/dist/discovery/startup-event.js.map +1 -0
- package/dist/discovery/storage-state.d.ts +26 -0
- package/dist/discovery/storage-state.js +86 -0
- package/dist/discovery/storage-state.js.map +1 -0
- package/dist/discovery/temporal-environment.d.ts +31 -0
- package/dist/discovery/temporal-environment.js +43 -0
- package/dist/discovery/temporal-environment.js.map +1 -0
- package/dist/discovery/visual-environment.d.ts +28 -0
- package/dist/discovery/visual-environment.js +42 -0
- package/dist/discovery/visual-environment.js.map +1 -0
- package/dist/domain/schema.d.ts +840 -20
- package/dist/domain/schema.js +216 -6
- package/dist/domain/schema.js.map +1 -1
- package/dist/faults/browser-context.d.ts +16 -0
- package/dist/faults/browser-context.js +60 -0
- package/dist/faults/browser-context.js.map +1 -0
- package/dist/faults/cookie-header.d.ts +5 -0
- package/dist/faults/cookie-header.js +25 -0
- package/dist/faults/cookie-header.js.map +1 -0
- package/dist/faults/document-bootstrap.d.ts +5 -0
- package/dist/faults/document-bootstrap.js +141 -0
- package/dist/faults/document-bootstrap.js.map +1 -0
- package/dist/faults/install.d.ts +1 -1
- package/dist/faults/install.js +199 -6
- package/dist/faults/install.js.map +1 -1
- package/dist/faults/pattern.d.ts +1 -0
- package/dist/faults/pattern.js +24 -0
- package/dist/faults/pattern.js.map +1 -0
- package/dist/investigator/agent.js +39 -17
- package/dist/investigator/agent.js.map +1 -1
- package/dist/investigator/ledger.d.ts +1 -1
- package/dist/investigator/ledger.js +2 -2
- package/dist/investigator/ledger.js.map +1 -1
- package/dist/investigator/safe-source.d.ts +1 -0
- package/dist/investigator/safe-source.js +12 -3
- package/dist/investigator/safe-source.js.map +1 -1
- package/dist/investigator/schema.d.ts +293 -2
- package/dist/investigator/schema.js +100 -2
- package/dist/investigator/schema.js.map +1 -1
- package/dist/proof/cli.d.ts +7 -0
- package/dist/proof/cli.js +108 -0
- package/dist/proof/cli.js.map +1 -0
- package/dist/proof/preflight.d.ts +4 -0
- package/dist/proof/preflight.js +9 -0
- package/dist/proof/preflight.js.map +1 -0
- package/dist/repair/generator.d.ts +12 -1
- package/dist/repair/generator.js +30 -6
- package/dist/repair/generator.js.map +1 -1
- package/dist/repair/remote-proof-runner.js +6 -10
- package/dist/repair/remote-proof-runner.js.map +1 -1
- package/dist/repair/schema.d.ts +77 -2
- package/dist/repair/schema.js +23 -2
- package/dist/repair/schema.js.map +1 -1
- package/dist/repair/solari-validator.d.ts +2 -0
- package/dist/repair/solari-validator.js +4 -6
- package/dist/repair/solari-validator.js.map +1 -1
- package/dist/repair/summary.d.ts +10 -0
- package/dist/repair/summary.js +58 -0
- package/dist/repair/summary.js.map +1 -0
- package/dist/repair/validator.d.ts +1 -0
- package/dist/repair/validator.js +53 -12
- package/dist/repair/validator.js.map +1 -1
- package/dist/report/bundle.js +16 -37
- package/dist/report/bundle.js.map +1 -1
- package/dist/report/model.js +131 -12
- package/dist/report/model.js.map +1 -1
- package/dist/report/open.d.ts +9 -0
- package/dist/report/open.js +23 -0
- package/dist/report/open.js.map +1 -1
- package/dist/report/report-client.css +2 -0
- package/dist/report/report-client.js +58 -0
- package/dist/report/schema.d.ts +115 -5
- package/dist/report/schema.js +24 -5
- package/dist/report/schema.js.map +1 -1
- package/dist/reproducer/schema.d.ts +89 -4
- package/dist/reproducer/schema.js +3 -4
- package/dist/reproducer/schema.js.map +1 -1
- package/dist/runner/execution-fault.d.ts +10 -0
- package/dist/runner/execution-fault.js +24 -0
- package/dist/runner/execution-fault.js.map +1 -0
- package/dist/runner/fault-proxy.d.ts +7 -0
- package/dist/runner/fault-proxy.js +366 -0
- package/dist/runner/fault-proxy.js.map +1 -0
- package/dist/runner/local.js +2 -2
- package/dist/runner/local.js.map +1 -1
- package/dist/runner/native-scan.d.ts +25 -0
- package/dist/runner/native-scan.js +306 -0
- package/dist/runner/native-scan.js.map +1 -0
- package/dist/runner/playwright-executor.d.ts +3 -0
- package/dist/runner/playwright-executor.js +125 -66
- package/dist/runner/playwright-executor.js.map +1 -1
- package/dist/runner/process-tree.d.ts +7 -0
- package/dist/runner/process-tree.js +62 -0
- package/dist/runner/process-tree.js.map +1 -0
- package/dist/runner/project-bridge.d.ts +7 -0
- package/dist/runner/project-bridge.js +83 -0
- package/dist/runner/project-bridge.js.map +1 -0
- package/dist/runner/trial-reporter.d.ts +7 -0
- package/dist/runner/trial-reporter.js +47 -0
- package/dist/runner/trial-reporter.js.map +1 -0
- package/dist/scan/failure-clusters.d.ts +24 -0
- package/dist/scan/failure-clusters.js +74 -0
- package/dist/scan/failure-clusters.js.map +1 -0
- package/dist/scan/schema.d.ts +170 -0
- package/dist/scan/schema.js +71 -0
- package/dist/scan/schema.js.map +1 -0
- package/dist/solari/executor.d.ts +5 -1
- package/dist/solari/executor.js +25 -17
- package/dist/solari/executor.js.map +1 -1
- package/dist/solari/run-demo.d.ts +13 -1
- package/dist/solari/run-demo.js +35 -16
- package/dist/solari/run-demo.js.map +1 -1
- package/dist/solari/usage.d.ts +8 -2
- package/dist/solari/usage.js +14 -4
- package/dist/solari/usage.js.map +1 -1
- package/dist/ui/boundary.d.ts +17 -0
- package/dist/ui/boundary.js +18 -0
- package/dist/ui/boundary.js.map +1 -0
- package/dist/ui/console.d.ts +4 -0
- package/dist/ui/console.js +11 -0
- package/dist/ui/console.js.map +1 -0
- package/dist/ui/document.d.ts +40 -0
- package/dist/ui/document.js +120 -0
- package/dist/ui/document.js.map +1 -0
- package/dist/ui/format.d.ts +8 -0
- package/dist/ui/format.js +32 -0
- package/dist/ui/format.js.map +1 -0
- package/dist/ui/progress.d.ts +17 -1
- package/dist/ui/progress.js +51 -8
- package/dist/ui/progress.js.map +1 -1
- package/dist/ui/status.d.ts +7 -0
- package/dist/ui/status.js +36 -0
- package/dist/ui/status.js.map +1 -0
- package/dist/ui/style.d.ts +8 -0
- package/dist/ui/style.js +22 -0
- package/dist/ui/style.js.map +1 -0
- package/dist/ui/text.d.ts +17 -0
- package/dist/ui/text.js +123 -0
- package/dist/ui/text.js.map +1 -0
- package/dist/ui/theme.d.ts +23 -0
- package/dist/ui/theme.js +77 -0
- package/dist/ui/theme.js.map +1 -0
- package/dist/ui/trial-progress.d.ts +13 -0
- package/dist/ui/trial-progress.js +42 -0
- package/dist/ui/trial-progress.js.map +1 -0
- package/package.json +14 -19
- package/dist/faults/network-delay.d.ts +0 -5
- package/dist/faults/network-delay.js +0 -34
- package/dist/faults/network-delay.js.map +0 -1
- package/dist/faults/request-failure.d.ts +0 -5
- package/dist/faults/request-failure.js +0 -24
- package/dist/faults/request-failure.js.map +0 -1
- package/dist/playwright.d.ts +0 -3
- package/dist/playwright.js +0 -21
- package/dist/playwright.js.map +0 -1
- package/dist/report/browser-entry.d.ts +0 -2
- package/dist/report/browser-entry.js +0 -15
- package/dist/report/browser-entry.js.map +0 -1
- package/dist/report/components/artifacts.d.ts +0 -4
- package/dist/report/components/artifacts.js +0 -6
- package/dist/report/components/artifacts.js.map +0 -1
- package/dist/report/components/experiments.d.ts +0 -4
- package/dist/report/components/experiments.js +0 -7
- package/dist/report/components/experiments.js.map +0 -1
- package/dist/report/components/hypotheses.d.ts +0 -4
- package/dist/report/components/hypotheses.js +0 -26
- package/dist/report/components/hypotheses.js.map +0 -1
- package/dist/report/components/indicators.d.ts +0 -32
- package/dist/report/components/indicators.js +0 -42
- package/dist/report/components/indicators.js.map +0 -1
- package/dist/report/components/layout.d.ts +0 -29
- package/dist/report/components/layout.js +0 -20
- package/dist/report/components/layout.js.map +0 -1
- package/dist/report/components/proof.d.ts +0 -4
- package/dist/report/components/proof.js +0 -34
- package/dist/report/components/proof.js.map +0 -1
- package/dist/report/components/reproduction.d.ts +0 -4
- package/dist/report/components/reproduction.js +0 -19
- package/dist/report/components/reproduction.js.map +0 -1
- package/dist/report/components/summary.d.ts +0 -4
- package/dist/report/components/summary.js +0 -12
- package/dist/report/components/summary.js.map +0 -1
- package/dist/report/components/verdict.d.ts +0 -4
- package/dist/report/components/verdict.js +0 -27
- package/dist/report/components/verdict.js.map +0 -1
- package/dist/report/report-app.d.ts +0 -6
- package/dist/report/report-app.js +0 -16
- package/dist/report/report-app.js.map +0 -1
- package/dist/report/report-details.css +0 -182
- package/dist/report/report.css +0 -404
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type AskQuestion = (question: string) => Promise<string>;
|
|
2
|
+
interface SolariHandoffOptions {
|
|
3
|
+
ask?: AskQuestion;
|
|
4
|
+
environment?: NodeJS.ProcessEnv;
|
|
5
|
+
inputIsTTY?: boolean;
|
|
6
|
+
outputIsTTY?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function requestSolariProof(target: string, approvedSources: string[], options?: SolariHandoffOptions): Promise<string[] | null>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { createInterface } from "node:readline/promises";
|
|
2
|
+
import { sanitizeLine } from "../ui/text.js";
|
|
3
|
+
function interactive(options) {
|
|
4
|
+
const environment = options.environment ?? process.env;
|
|
5
|
+
return (options.inputIsTTY ?? Boolean(process.stdin.isTTY))
|
|
6
|
+
&& (options.outputIsTTY ?? Boolean(process.stderr.isTTY))
|
|
7
|
+
&& !environment.CI;
|
|
8
|
+
}
|
|
9
|
+
async function askInTerminal(question) {
|
|
10
|
+
const prompt = createInterface({ input: process.stdin, output: process.stderr });
|
|
11
|
+
try {
|
|
12
|
+
return await prompt.question(question);
|
|
13
|
+
}
|
|
14
|
+
finally {
|
|
15
|
+
prompt.close();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function accepted(answer) {
|
|
19
|
+
const normalized = answer.trim().toLowerCase();
|
|
20
|
+
return normalized === "y" || normalized === "yes";
|
|
21
|
+
}
|
|
22
|
+
export async function requestSolariProof(target, approvedSources, options = {}) {
|
|
23
|
+
if (!interactive(options)) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const ask = options.ask ?? askInTerminal;
|
|
27
|
+
if (!accepted(await ask("Use Solari to prove a candidate fix? [y/N] "))) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
if (!accepted(await ask("Use AI to investigate and generate the candidate? [y/N] "))) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
if (approvedSources.length > 0) {
|
|
34
|
+
return approvedSources;
|
|
35
|
+
}
|
|
36
|
+
const safeTarget = sanitizeLine(target);
|
|
37
|
+
const source = (await ask(`Source file to approve for candidate changes [${safeTarget}]: `)).trim();
|
|
38
|
+
return [source || target];
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=solari-handoff.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solari-handoff.js","sourceRoot":"","sources":["../../src/diagnosis/solari-handoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAW5C,SAAS,WAAW,CAAC,OAA6B;IAChD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAA;IACtD,OAAO,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;WACtD,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;WACtD,CAAC,WAAW,CAAC,EAAE,CAAA;AACtB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,QAAgB;IAC3C,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAChF,IAAI,CAAC;QACH,OAAO,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IAC9C,OAAO,UAAU,KAAK,GAAG,IAAI,UAAU,KAAK,KAAK,CAAA;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAc,EACd,eAAyB,EACzB,UAAgC,EAAE;IAElC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,aAAa,CAAA;IACxC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,6CAA6C,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,0DAA0D,CAAC,CAAC,EAAE,CAAC;QACrF,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,eAAe,CAAA;IACxB,CAAC;IACD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CACvB,iDAAiD,UAAU,KAAK,CACjE,CAAC,CAAC,IAAI,EAAE,CAAA;IACT,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,CAAA;AAC3B,CAAC"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { TerminalDocument } from "../ui/document.js";
|
|
2
|
+
import { formatDuration, formatUsd } from "../ui/format.js";
|
|
3
|
+
import { PLAIN_THEME } from "../ui/theme.js";
|
|
4
|
+
const STATUS_TONES = {
|
|
5
|
+
complete: "success",
|
|
6
|
+
failed: "failure",
|
|
7
|
+
interrupted: "warning",
|
|
8
|
+
running: "running",
|
|
9
|
+
};
|
|
10
|
+
const STAGE_TONES = {
|
|
11
|
+
investigated: "success",
|
|
12
|
+
observed: "success",
|
|
13
|
+
"repair-proven": "success",
|
|
14
|
+
"repair-rejected": "failure",
|
|
15
|
+
"reproducer-created": "success",
|
|
16
|
+
};
|
|
17
|
+
function verdictTone(artifact) {
|
|
18
|
+
if (artifact.status !== "complete") {
|
|
19
|
+
return STATUS_TONES[artifact.status];
|
|
20
|
+
}
|
|
21
|
+
return STAGE_TONES[artifact.stage];
|
|
22
|
+
}
|
|
23
|
+
function solariEstimate(value) {
|
|
24
|
+
return value === null ? "not available" : formatUsd(value);
|
|
25
|
+
}
|
|
26
|
+
function plannedRows(artifact) {
|
|
27
|
+
const recommendation = artifact.recommendation;
|
|
28
|
+
const rows = [
|
|
29
|
+
{ label: "Runs", value: `${recommendation.plannedTrials}` },
|
|
30
|
+
{ label: "Time", value: recommendation.expectedDuration },
|
|
31
|
+
{ label: "Solari cost", value: solariEstimate(recommendation.solariCostEstimateUsd) },
|
|
32
|
+
];
|
|
33
|
+
if (recommendation.aiCostLimitUsd !== null) {
|
|
34
|
+
rows.push({ label: "AI cost cap", value: formatUsd(recommendation.aiCostLimitUsd) });
|
|
35
|
+
}
|
|
36
|
+
rows.push({
|
|
37
|
+
label: "Credentials",
|
|
38
|
+
value: recommendation.credentials.length > 0
|
|
39
|
+
? recommendation.credentials.join(" · ")
|
|
40
|
+
: "none",
|
|
41
|
+
});
|
|
42
|
+
return rows;
|
|
43
|
+
}
|
|
44
|
+
function consumedRows(artifact) {
|
|
45
|
+
const actual = artifact.usage.actual;
|
|
46
|
+
return [
|
|
47
|
+
{ label: "Runs", value: `${actual.executions}` },
|
|
48
|
+
{ label: "Wall time", value: formatDuration(actual.elapsedMilliseconds) },
|
|
49
|
+
{
|
|
50
|
+
label: "AI tokens",
|
|
51
|
+
value: `${actual.aiInputTokens} input · ${actual.aiOutputTokens} output`,
|
|
52
|
+
},
|
|
53
|
+
{ label: "AI cost est.", value: formatUsd(actual.aiEstimatedCostUsd, 4) },
|
|
54
|
+
{
|
|
55
|
+
label: "Solari",
|
|
56
|
+
value: `${actual.solariSandboxesCreated} created`
|
|
57
|
+
+ ` · ${actual.solariSandboxesKilled} released`,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
label: "Solari cost",
|
|
61
|
+
value: actual.solariCostUsd === null
|
|
62
|
+
? "not available from provider"
|
|
63
|
+
: formatUsd(actual.solariCostUsd),
|
|
64
|
+
},
|
|
65
|
+
];
|
|
66
|
+
}
|
|
67
|
+
function appendEvidence(document, artifact, path) {
|
|
68
|
+
const rows = [{ label: "Diagnosis", value: path }];
|
|
69
|
+
const artifacts = [
|
|
70
|
+
["Analysis", artifact.artifacts.analysis],
|
|
71
|
+
["Scan", artifact.artifacts.scan],
|
|
72
|
+
["Reproducer", artifact.artifacts.reproducer],
|
|
73
|
+
["Investigation", artifact.artifacts.evidence],
|
|
74
|
+
["Patch", artifact.artifacts.patch],
|
|
75
|
+
["Proof", artifact.artifacts.proof],
|
|
76
|
+
["Report", artifact.artifacts.html],
|
|
77
|
+
];
|
|
78
|
+
for (const [label, value] of artifacts) {
|
|
79
|
+
if (value) {
|
|
80
|
+
rows.push({ label, value });
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
document.section("Evidence").rows(rows);
|
|
84
|
+
}
|
|
85
|
+
export function formatDiagnosisSummary(artifact, path, theme = PLAIN_THEME) {
|
|
86
|
+
const recommendation = artifact.recommendation;
|
|
87
|
+
const document = new TerminalDocument(theme);
|
|
88
|
+
document.heading("adaptive diagnosis");
|
|
89
|
+
document.verdict(verdictTone(artifact), `${artifact.stage} · ${artifact.status}`, recommendation.rationale);
|
|
90
|
+
if (artifact.lastError) {
|
|
91
|
+
document.detail(artifact.lastError, "failure");
|
|
92
|
+
}
|
|
93
|
+
document.blank().rows([
|
|
94
|
+
{ label: "Observed", value: artifact.observation.status },
|
|
95
|
+
{
|
|
96
|
+
label: "Measured",
|
|
97
|
+
value: `${artifact.observation.tests} test(s)`
|
|
98
|
+
+ ` · ${artifact.observation.failures} failure(s)`
|
|
99
|
+
+ ` · ${artifact.observation.executions} execution(s)`,
|
|
100
|
+
},
|
|
101
|
+
]);
|
|
102
|
+
document.section("Planned").rows(plannedRows(artifact));
|
|
103
|
+
document.note(recommendation.solariCostNote);
|
|
104
|
+
document.section("Consumed").rows(consumedRows(artifact));
|
|
105
|
+
document.section("Resources").rows([
|
|
106
|
+
{ label: "Cache", value: `${artifact.cache.status} · ${artifact.cache.reason}` },
|
|
107
|
+
{ label: "Cleanup", value: artifact.cleanup.status },
|
|
108
|
+
]);
|
|
109
|
+
appendEvidence(document, artifact, path);
|
|
110
|
+
if (recommendation.command) {
|
|
111
|
+
document.section("Next").command(recommendation.command);
|
|
112
|
+
}
|
|
113
|
+
return document.render();
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/diagnosis/summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AuthCookieExpiryFault } from "../domain/schema.js";
|
|
2
|
+
import type { TrialExecutor } from "../runner/playwright-executor.js";
|
|
3
|
+
import type { ExperimentResult } from "./evaluate.js";
|
|
4
|
+
export interface AuthCookieDiscoveryOptions {
|
|
5
|
+
concurrency: number;
|
|
6
|
+
cookieName: string;
|
|
7
|
+
minimumFailureRate: number;
|
|
8
|
+
pattern: string;
|
|
9
|
+
seed: number;
|
|
10
|
+
signal?: AbortSignal;
|
|
11
|
+
trials: number;
|
|
12
|
+
}
|
|
13
|
+
export interface AuthCookieDiscoveryResult {
|
|
14
|
+
baseline: ExperimentResult;
|
|
15
|
+
experiments: ExperimentResult[];
|
|
16
|
+
trigger: AuthCookieExpiryFault;
|
|
17
|
+
triggerResult: ExperimentResult;
|
|
18
|
+
}
|
|
19
|
+
export declare function discoverAuthCookieExpiry(execute: TrialExecutor, options: AuthCookieDiscoveryOptions): Promise<AuthCookieDiscoveryResult>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { createCausalEvaluator } from "./evaluate.js";
|
|
2
|
+
const MINIMUM_CONFIRMATION_TRIALS = 12;
|
|
3
|
+
export async function discoverAuthCookieExpiry(execute, options) {
|
|
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 trigger = {
|
|
12
|
+
kind: "auth-cookie-expiry",
|
|
13
|
+
cookieName: options.cookieName,
|
|
14
|
+
pattern: options.pattern,
|
|
15
|
+
};
|
|
16
|
+
const first = await evaluator.evaluate([trigger]);
|
|
17
|
+
if (!first.confirmed) {
|
|
18
|
+
throw new Error("Auth cookie expiry did not reproduce the failure confidently");
|
|
19
|
+
}
|
|
20
|
+
const triggerResult = await evaluator.evaluate([trigger], Math.max(options.trials, MINIMUM_CONFIRMATION_TRIALS));
|
|
21
|
+
if (!triggerResult.confirmed) {
|
|
22
|
+
throw new Error("Auth cookie expiry did not reproduce in an independent confirmation batch");
|
|
23
|
+
}
|
|
24
|
+
return { baseline: evaluator.baseline(), experiments: [first, triggerResult], trigger, triggerResult };
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=auth-cookie.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-cookie.js","sourceRoot":"","sources":["../../src/discovery/auth-cookie.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAErD,MAAM,2BAA2B,GAAG,EAAE,CAAA;AAmBtC,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAsB,EACtB,OAAmC;IAEnC,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,OAAO,GAA0B;QACrC,IAAI,EAAE,oBAAoB;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAA;IACD,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,8DAA8D,CAAC,CAAA;IACjF,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,2EAA2E,CAAC,CAAA;IAC9F,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"}
|
|
@@ -1,22 +1,55 @@
|
|
|
1
|
-
import type { Fault } from "../domain/schema.js";
|
|
1
|
+
import type { Fault, TrialOutcome } from "../domain/schema.js";
|
|
2
2
|
import type { TrialExecutor } from "../runner/playwright-executor.js";
|
|
3
3
|
export interface ExperimentOptions {
|
|
4
4
|
concurrency: number;
|
|
5
|
-
|
|
5
|
+
faults: Fault[];
|
|
6
6
|
minimumFailureRate: number;
|
|
7
7
|
seed: number;
|
|
8
8
|
signal?: AbortSignal;
|
|
9
9
|
trials: number;
|
|
10
10
|
}
|
|
11
|
+
export interface FailureSignatureResult {
|
|
12
|
+
failures: number;
|
|
13
|
+
failureRate: number;
|
|
14
|
+
lowerBound80: number;
|
|
15
|
+
signature: string;
|
|
16
|
+
upperBound80: number;
|
|
17
|
+
}
|
|
18
|
+
export interface CausalEffect {
|
|
19
|
+
controlFailures: number;
|
|
20
|
+
controlRate: number;
|
|
21
|
+
controlUpperBound80: number;
|
|
22
|
+
failureRateIncrease: number;
|
|
23
|
+
signature: string;
|
|
24
|
+
treatmentFailures: number;
|
|
25
|
+
treatmentLowerBound80: number;
|
|
26
|
+
treatmentRate: number;
|
|
27
|
+
}
|
|
11
28
|
export interface ExperimentResult {
|
|
29
|
+
causalEffect?: CausalEffect;
|
|
12
30
|
confirmed: boolean;
|
|
13
31
|
dominantFailureSignature?: string;
|
|
14
32
|
dominantFailureReason?: string;
|
|
15
33
|
errors: number;
|
|
16
34
|
failed: number;
|
|
17
35
|
failureRate: number;
|
|
36
|
+
failureSignatures: FailureSignatureResult[];
|
|
18
37
|
lowerBound80: number;
|
|
19
38
|
passed: number;
|
|
39
|
+
representativeRuns: Array<{
|
|
40
|
+
artifacts: NonNullable<TrialOutcome["artifacts"]>;
|
|
41
|
+
durationMs: number;
|
|
42
|
+
status: "failed" | "passed";
|
|
43
|
+
trialId: string;
|
|
44
|
+
}>;
|
|
20
45
|
trials: number;
|
|
46
|
+
upperBound80: number;
|
|
47
|
+
}
|
|
48
|
+
interface CausalEvaluator {
|
|
49
|
+
baseline: () => ExperimentResult;
|
|
50
|
+
evaluate: (faults: Fault[], trials?: number) => Promise<ExperimentResult>;
|
|
21
51
|
}
|
|
52
|
+
type CausalEvaluatorOptions = Omit<ExperimentOptions, "faults">;
|
|
22
53
|
export declare function evaluateExperiment(execute: TrialExecutor, options: ExperimentOptions): Promise<ExperimentResult>;
|
|
54
|
+
export declare function createCausalEvaluator(execute: TrialExecutor, options: CausalEvaluatorOptions): CausalEvaluator;
|
|
55
|
+
export {};
|
|
@@ -1,24 +1,34 @@
|
|
|
1
1
|
import { deriveTrialSeed } from "../core/plan.js";
|
|
2
2
|
const WILSON_Z_80 = 1.281_551_565_545;
|
|
3
|
-
function
|
|
3
|
+
function wilsonInterval(failures, trials) {
|
|
4
4
|
if (trials === 0) {
|
|
5
|
-
return 0;
|
|
5
|
+
return { lowerBound80: 0, upperBound80: 0 };
|
|
6
6
|
}
|
|
7
7
|
const probability = failures / trials;
|
|
8
8
|
const squaredZ = WILSON_Z_80 ** 2;
|
|
9
9
|
const denominator = 1 + squaredZ / trials;
|
|
10
10
|
const center = probability + squaredZ / (2 * trials);
|
|
11
11
|
const margin = WILSON_Z_80 * Math.sqrt((probability * (1 - probability) + squaredZ / (4 * trials)) / trials);
|
|
12
|
-
return
|
|
12
|
+
return {
|
|
13
|
+
lowerBound80: Math.max(0, (center - margin) / denominator),
|
|
14
|
+
upperBound80: Math.min(1, (center + margin) / denominator),
|
|
15
|
+
};
|
|
13
16
|
}
|
|
14
|
-
function
|
|
17
|
+
function signatureResults(outcomes, trials) {
|
|
15
18
|
const counts = new Map();
|
|
16
19
|
for (const outcome of outcomes) {
|
|
17
20
|
if (outcome.status === "failed" && outcome.failureSignature) {
|
|
18
21
|
counts.set(outcome.failureSignature, (counts.get(outcome.failureSignature) ?? 0) + 1);
|
|
19
22
|
}
|
|
20
23
|
}
|
|
21
|
-
return [...counts.entries()]
|
|
24
|
+
return [...counts.entries()]
|
|
25
|
+
.map(([signature, failures]) => ({
|
|
26
|
+
failures,
|
|
27
|
+
failureRate: trials === 0 ? 0 : failures / trials,
|
|
28
|
+
...wilsonInterval(failures, trials),
|
|
29
|
+
signature,
|
|
30
|
+
}))
|
|
31
|
+
.sort((left, right) => right.failures - left.failures || left.signature.localeCompare(right.signature));
|
|
22
32
|
}
|
|
23
33
|
function dominantReason(outcomes, signature) {
|
|
24
34
|
return outcomes.find((outcome) => outcome.failureSignature === signature && outcome.failureReason)?.failureReason;
|
|
@@ -34,48 +44,144 @@ function validateOptions(options) {
|
|
|
34
44
|
throw new Error("minimum failure rate must be greater than 0 and at most 1");
|
|
35
45
|
}
|
|
36
46
|
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const plans = Array.from({ length: options.trials }, (_, index) => ({
|
|
40
|
-
trialId: `experiment-${index + 1}`,
|
|
41
|
-
index,
|
|
42
|
-
seed: deriveTrialSeed(options.seed, index),
|
|
43
|
-
fault: options.fault,
|
|
44
|
-
}));
|
|
45
|
-
const outcomes = new Map();
|
|
47
|
+
async function executePlans(execute, plans, concurrency, signal) {
|
|
48
|
+
const completed = new Map();
|
|
46
49
|
let nextIndex = 0;
|
|
47
50
|
const worker = async () => {
|
|
48
|
-
while (!
|
|
51
|
+
while (!signal?.aborted) {
|
|
49
52
|
const index = nextIndex;
|
|
50
53
|
nextIndex += 1;
|
|
51
|
-
|
|
54
|
+
const plan = plans[index];
|
|
55
|
+
if (!plan) {
|
|
52
56
|
return;
|
|
53
57
|
}
|
|
54
|
-
|
|
58
|
+
completed.set(index, { outcome: await execute(plan), plan });
|
|
55
59
|
}
|
|
56
60
|
};
|
|
57
|
-
await Promise.all(Array.from({ length: Math.min(
|
|
58
|
-
|
|
61
|
+
await Promise.all(Array.from({ length: Math.min(concurrency, plans.length) }, worker));
|
|
62
|
+
return [...completed.entries()]
|
|
59
63
|
.sort((left, right) => left[0] - right[0])
|
|
60
64
|
.map((entry) => entry[1]);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
const
|
|
65
|
-
const
|
|
66
|
-
const
|
|
65
|
+
}
|
|
66
|
+
function summarize(completed, minimumFailureRate) {
|
|
67
|
+
const outcomes = completed.map((entry) => entry.outcome);
|
|
68
|
+
const failed = outcomes.filter((outcome) => outcome.status === "failed").length;
|
|
69
|
+
const errors = outcomes.filter((outcome) => outcome.status === "error").length;
|
|
70
|
+
const passed = outcomes.filter((outcome) => outcome.status === "passed").length;
|
|
71
|
+
const failureRate = outcomes.length === 0 ? 0 : failed / outcomes.length;
|
|
72
|
+
const confidence = wilsonInterval(failed, outcomes.length);
|
|
73
|
+
const failureSignatures = signatureResults(outcomes, outcomes.length);
|
|
74
|
+
const dominantFailureSignature = failureSignatures[0]?.signature;
|
|
75
|
+
const representativeRuns = ["passed", "failed"].flatMap((status) => {
|
|
76
|
+
const entry = completed.find((trial) => trial.outcome.status === status);
|
|
77
|
+
if (!entry) {
|
|
78
|
+
return [];
|
|
79
|
+
}
|
|
80
|
+
return [{
|
|
81
|
+
artifacts: entry.outcome.artifacts ?? [],
|
|
82
|
+
durationMs: entry.outcome.durationMs,
|
|
83
|
+
status,
|
|
84
|
+
trialId: entry.plan.trialId,
|
|
85
|
+
}];
|
|
86
|
+
});
|
|
67
87
|
return {
|
|
68
88
|
confirmed: errors === 0
|
|
69
|
-
&& failureRate >=
|
|
70
|
-
&& lowerBound80 >=
|
|
89
|
+
&& failureRate >= minimumFailureRate
|
|
90
|
+
&& confidence.lowerBound80 >= minimumFailureRate,
|
|
71
91
|
dominantFailureSignature,
|
|
72
|
-
dominantFailureReason: dominantReason(
|
|
92
|
+
dominantFailureReason: dominantReason(outcomes, dominantFailureSignature),
|
|
73
93
|
errors,
|
|
74
94
|
failed,
|
|
75
95
|
failureRate,
|
|
76
|
-
|
|
96
|
+
failureSignatures,
|
|
97
|
+
...confidence,
|
|
77
98
|
passed,
|
|
78
|
-
|
|
99
|
+
representativeRuns,
|
|
100
|
+
trials: outcomes.length,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
function causalTreatment(control, treatment, minimumFailureRate) {
|
|
104
|
+
const treatedSignature = treatment.failureSignatures[0];
|
|
105
|
+
if (!treatedSignature) {
|
|
106
|
+
return { ...treatment, confirmed: false };
|
|
107
|
+
}
|
|
108
|
+
const controlSignature = control.failureSignatures.find((entry) => entry.signature === treatedSignature.signature);
|
|
109
|
+
const controlConfidence = controlSignature ?? {
|
|
110
|
+
failures: 0,
|
|
111
|
+
failureRate: 0,
|
|
112
|
+
...wilsonInterval(0, control.trials),
|
|
113
|
+
signature: treatedSignature.signature,
|
|
114
|
+
};
|
|
115
|
+
const causalEffect = {
|
|
116
|
+
controlFailures: controlConfidence.failures,
|
|
117
|
+
controlRate: controlConfidence.failureRate,
|
|
118
|
+
controlUpperBound80: controlConfidence.upperBound80,
|
|
119
|
+
failureRateIncrease: treatedSignature.failureRate - controlConfidence.failureRate,
|
|
120
|
+
signature: treatedSignature.signature,
|
|
121
|
+
treatmentFailures: treatedSignature.failures,
|
|
122
|
+
treatmentLowerBound80: treatedSignature.lowerBound80,
|
|
123
|
+
treatmentRate: treatedSignature.failureRate,
|
|
124
|
+
};
|
|
125
|
+
return {
|
|
126
|
+
...treatment,
|
|
127
|
+
causalEffect,
|
|
128
|
+
confirmed: control.errors === 0
|
|
129
|
+
&& treatment.errors === 0
|
|
130
|
+
&& treatedSignature.failureRate >= minimumFailureRate
|
|
131
|
+
&& treatedSignature.lowerBound80 >= minimumFailureRate
|
|
132
|
+
&& treatedSignature.lowerBound80 > controlConfidence.upperBound80,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
export async function evaluateExperiment(execute, options) {
|
|
136
|
+
validateOptions(options);
|
|
137
|
+
const plans = Array.from({ length: options.trials }, (_, index) => ({
|
|
138
|
+
faults: [...options.faults],
|
|
139
|
+
index,
|
|
140
|
+
seed: deriveTrialSeed(options.seed, index),
|
|
141
|
+
trialId: `experiment-${index + 1}`,
|
|
142
|
+
}));
|
|
143
|
+
return summarize(await executePlans(execute, plans, options.concurrency, options.signal), options.minimumFailureRate);
|
|
144
|
+
}
|
|
145
|
+
async function evaluateCausalExperiment(execute, options, batch) {
|
|
146
|
+
validateOptions(options);
|
|
147
|
+
const scheduled = Array.from({ length: options.trials }, (_, index) => {
|
|
148
|
+
const seed = deriveTrialSeed(options.seed, index);
|
|
149
|
+
const planIndex = batch * 1_000 + index * 2;
|
|
150
|
+
const control = {
|
|
151
|
+
faults: [],
|
|
152
|
+
index: planIndex,
|
|
153
|
+
seed,
|
|
154
|
+
trialId: `batch-${batch}-control-${index + 1}`,
|
|
155
|
+
};
|
|
156
|
+
const treatment = {
|
|
157
|
+
faults: [...options.faults],
|
|
158
|
+
index: planIndex + 1,
|
|
159
|
+
seed,
|
|
160
|
+
trialId: `batch-${batch}-intervention-${index + 1}`,
|
|
161
|
+
};
|
|
162
|
+
return index % 2 === 0 ? [control, treatment] : [treatment, control];
|
|
163
|
+
}).flat();
|
|
164
|
+
const completed = await executePlans(execute, scheduled, options.concurrency, options.signal);
|
|
165
|
+
const control = summarize(completed.filter((entry) => entry.plan.faults.length === 0), options.minimumFailureRate);
|
|
166
|
+
const treatment = summarize(completed.filter((entry) => entry.plan.faults.length > 0), options.minimumFailureRate);
|
|
167
|
+
return { control, treatment: causalTreatment(control, treatment, options.minimumFailureRate) };
|
|
168
|
+
}
|
|
169
|
+
export function createCausalEvaluator(execute, options) {
|
|
170
|
+
let firstControl;
|
|
171
|
+
let batch = 0;
|
|
172
|
+
return {
|
|
173
|
+
baseline: () => {
|
|
174
|
+
if (!firstControl) {
|
|
175
|
+
throw new Error("A causal intervention must run before its baseline is available");
|
|
176
|
+
}
|
|
177
|
+
return firstControl;
|
|
178
|
+
},
|
|
179
|
+
evaluate: async (faults, trials = options.trials) => {
|
|
180
|
+
batch += 1;
|
|
181
|
+
const result = await evaluateCausalExperiment(execute, { ...options, faults, trials }, batch);
|
|
182
|
+
firstControl ??= result.control;
|
|
183
|
+
return result.treatment;
|
|
184
|
+
},
|
|
79
185
|
};
|
|
80
186
|
}
|
|
81
187
|
//# sourceMappingURL=evaluate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/discovery/evaluate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAIjD,MAAM,WAAW,GAAG,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../../src/discovery/evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { EventLoopStallFault } from "../domain/schema.js";
|
|
2
|
+
import type { TrialExecutor } from "../runner/playwright-executor.js";
|
|
3
|
+
import type { ExperimentResult } from "./evaluate.js";
|
|
4
|
+
export interface EventLoopDiscoveryOptions {
|
|
5
|
+
concurrency: number;
|
|
6
|
+
maximumDurationMs: number;
|
|
7
|
+
minimumFailureRate: number;
|
|
8
|
+
pattern: string;
|
|
9
|
+
seed: number;
|
|
10
|
+
signal?: AbortSignal;
|
|
11
|
+
startAfterMs: number;
|
|
12
|
+
trials: number;
|
|
13
|
+
}
|
|
14
|
+
export interface EventLoopExperiment {
|
|
15
|
+
durationMs: number;
|
|
16
|
+
result: ExperimentResult;
|
|
17
|
+
}
|
|
18
|
+
export interface EventLoopDiscoveryResult {
|
|
19
|
+
baseline: ExperimentResult;
|
|
20
|
+
experiments: EventLoopExperiment[];
|
|
21
|
+
minimumDurationMs: number;
|
|
22
|
+
trigger: EventLoopStallFault;
|
|
23
|
+
triggerResult: ExperimentResult;
|
|
24
|
+
}
|
|
25
|
+
export declare function discoverEventLoopStall(execute: TrialExecutor, options: EventLoopDiscoveryOptions): Promise<EventLoopDiscoveryResult>;
|