swipium 1.0.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.
- package/LICENSE +21 -0
- package/README.md +295 -0
- package/dist/appMap/automationLink.js +74 -0
- package/dist/appMap/automationLink.js.map +1 -0
- package/dist/appMap/build.js +193 -0
- package/dist/appMap/build.js.map +1 -0
- package/dist/appMap/codeIndex.js +73 -0
- package/dist/appMap/codeIndex.js.map +1 -0
- package/dist/appMap/featureModel.js +83 -0
- package/dist/appMap/featureModel.js.map +1 -0
- package/dist/appMap/firstRunApply.js +131 -0
- package/dist/appMap/firstRunApply.js.map +1 -0
- package/dist/appMap/fsWalk.js +75 -0
- package/dist/appMap/fsWalk.js.map +1 -0
- package/dist/appMap/issues.js +227 -0
- package/dist/appMap/issues.js.map +1 -0
- package/dist/appMap/migrations.js +87 -0
- package/dist/appMap/migrations.js.map +1 -0
- package/dist/appMap/prelaunch.js +66 -0
- package/dist/appMap/prelaunch.js.map +1 -0
- package/dist/appMap/projectRegistry.js +70 -0
- package/dist/appMap/projectRegistry.js.map +1 -0
- package/dist/appMap/provenance.js +52 -0
- package/dist/appMap/provenance.js.map +1 -0
- package/dist/appMap/query.js +118 -0
- package/dist/appMap/query.js.map +1 -0
- package/dist/appMap/runtimeMerge.js +207 -0
- package/dist/appMap/runtimeMerge.js.map +1 -0
- package/dist/appMap/schema.js +65 -0
- package/dist/appMap/schema.js.map +1 -0
- package/dist/appMap/screenMatch.js +75 -0
- package/dist/appMap/screenMatch.js.map +1 -0
- package/dist/appMap/staticScan.js +614 -0
- package/dist/appMap/staticScan.js.map +1 -0
- package/dist/appMap/store.js +173 -0
- package/dist/appMap/store.js.map +1 -0
- package/dist/appMap/tsAstScan.js +184 -0
- package/dist/appMap/tsAstScan.js.map +1 -0
- package/dist/artifacts/bundletool.js +199 -0
- package/dist/artifacts/bundletool.js.map +1 -0
- package/dist/artifacts/resolve.js +388 -0
- package/dist/artifacts/resolve.js.map +1 -0
- package/dist/automationGen/appiumModel.js +129 -0
- package/dist/automationGen/appiumModel.js.map +1 -0
- package/dist/automationGen/ciEmitter.js +80 -0
- package/dist/automationGen/ciEmitter.js.map +1 -0
- package/dist/automationGen/jsEmitter.js +440 -0
- package/dist/automationGen/jsEmitter.js.map +1 -0
- package/dist/automationGen/packagePatch.js +56 -0
- package/dist/automationGen/packagePatch.js.map +1 -0
- package/dist/automationGen/projectProfile.js +317 -0
- package/dist/automationGen/projectProfile.js.map +1 -0
- package/dist/automationGen/pythonEmitter.js +386 -0
- package/dist/automationGen/pythonEmitter.js.map +1 -0
- package/dist/automationGen/readmeEmitter.js +66 -0
- package/dist/automationGen/readmeEmitter.js.map +1 -0
- package/dist/automationGen/suitePlan.js +94 -0
- package/dist/automationGen/suitePlan.js.map +1 -0
- package/dist/automationGen/validation.js +150 -0
- package/dist/automationGen/validation.js.map +1 -0
- package/dist/build/parseBuildLog.js +119 -0
- package/dist/build/parseBuildLog.js.map +1 -0
- package/dist/build/plan.js +150 -0
- package/dist/build/plan.js.map +1 -0
- package/dist/ci/preflight.js +85 -0
- package/dist/ci/preflight.js.map +1 -0
- package/dist/cli/init.js +105 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/scan.js +85 -0
- package/dist/cli/scan.js.map +1 -0
- package/dist/cli/suite.js +85 -0
- package/dist/cli/suite.js.map +1 -0
- package/dist/cli/verify.js +62 -0
- package/dist/cli/verify.js.map +1 -0
- package/dist/consent/consent.js +43 -0
- package/dist/consent/consent.js.map +1 -0
- package/dist/context/detect.js +156 -0
- package/dist/context/detect.js.map +1 -0
- package/dist/context/findApps.js +198 -0
- package/dist/context/findApps.js.map +1 -0
- package/dist/context/projectRoot.js +41 -0
- package/dist/context/projectRoot.js.map +1 -0
- package/dist/context/scan.js +167 -0
- package/dist/context/scan.js.map +1 -0
- package/dist/core/target.js +115 -0
- package/dist/core/target.js.map +1 -0
- package/dist/core/targetPlan.js +140 -0
- package/dist/core/targetPlan.js.map +1 -0
- package/dist/drivers/DirectDriver.js +228 -0
- package/dist/drivers/DirectDriver.js.map +1 -0
- package/dist/drivers/Driver.js +4 -0
- package/dist/drivers/Driver.js.map +1 -0
- package/dist/drivers/SimctlDriver.js +127 -0
- package/dist/drivers/SimctlDriver.js.map +1 -0
- package/dist/drivers/WdaDriver.js +250 -0
- package/dist/drivers/WdaDriver.js.map +1 -0
- package/dist/explore/candidates.js +93 -0
- package/dist/explore/candidates.js.map +1 -0
- package/dist/explore/graph.js +116 -0
- package/dist/explore/graph.js.map +1 -0
- package/dist/explore/memory.js +35 -0
- package/dist/explore/memory.js.map +1 -0
- package/dist/explore/planner.js +105 -0
- package/dist/explore/planner.js.map +1 -0
- package/dist/explore/policy.js +85 -0
- package/dist/explore/policy.js.map +1 -0
- package/dist/explore/runner.js +475 -0
- package/dist/explore/runner.js.map +1 -0
- package/dist/explore/signatures.js +35 -0
- package/dist/explore/signatures.js.map +1 -0
- package/dist/explore/suite.js +55 -0
- package/dist/explore/suite.js.map +1 -0
- package/dist/featureTesting/executionBootstrap.js +140 -0
- package/dist/featureTesting/executionBootstrap.js.map +1 -0
- package/dist/firstRun/authStateMachine.js +83 -0
- package/dist/firstRun/authStateMachine.js.map +1 -0
- package/dist/firstRun/classifyScreen.js +201 -0
- package/dist/firstRun/classifyScreen.js.map +1 -0
- package/dist/firstRun/firstRunPlanner.js +207 -0
- package/dist/firstRun/firstRunPlanner.js.map +1 -0
- package/dist/firstRun/firstRunRunner.js +331 -0
- package/dist/firstRun/firstRunRunner.js.map +1 -0
- package/dist/firstRun/generatedDataPolicy.js +215 -0
- package/dist/firstRun/generatedDataPolicy.js.map +1 -0
- package/dist/firstRun/inputPlanner.js +67 -0
- package/dist/firstRun/inputPlanner.js.map +1 -0
- package/dist/firstRun/onboardingStateMachine.js +46 -0
- package/dist/firstRun/onboardingStateMachine.js.map +1 -0
- package/dist/firstRun/paywallPolicy.js +54 -0
- package/dist/firstRun/paywallPolicy.js.map +1 -0
- package/dist/firstRun/types.js +7 -0
- package/dist/firstRun/types.js.map +1 -0
- package/dist/fixtures/catalog.js +131 -0
- package/dist/fixtures/catalog.js.map +1 -0
- package/dist/flows/discover.js +18 -0
- package/dist/flows/discover.js.map +1 -0
- package/dist/flows/generate.js +211 -0
- package/dist/flows/generate.js.map +1 -0
- package/dist/flows/lint.js +97 -0
- package/dist/flows/lint.js.map +1 -0
- package/dist/flows/pack.js +68 -0
- package/dist/flows/pack.js.map +1 -0
- package/dist/flows/run.js +738 -0
- package/dist/flows/run.js.map +1 -0
- package/dist/flows/schema.js +240 -0
- package/dist/flows/schema.js.map +1 -0
- package/dist/flows/seedExec.js +108 -0
- package/dist/flows/seedExec.js.map +1 -0
- package/dist/flows/templates.js +155 -0
- package/dist/flows/templates.js.map +1 -0
- package/dist/flows/waitGuards.js +12 -0
- package/dist/flows/waitGuards.js.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/ios/signing.js +182 -0
- package/dist/ios/signing.js.map +1 -0
- package/dist/issues/classify.js +186 -0
- package/dist/issues/classify.js.map +1 -0
- package/dist/issues/fingerprint.js +130 -0
- package/dist/issues/fingerprint.js.map +1 -0
- package/dist/issues/index.js +240 -0
- package/dist/issues/index.js.map +1 -0
- package/dist/issues/metrics.js +155 -0
- package/dist/issues/metrics.js.map +1 -0
- package/dist/issues/recurrence.js +193 -0
- package/dist/issues/recurrence.js.map +1 -0
- package/dist/issues/report.js +110 -0
- package/dist/issues/report.js.map +1 -0
- package/dist/issues/reportBridge.js +119 -0
- package/dist/issues/reportBridge.js.map +1 -0
- package/dist/issues/schema.js +90 -0
- package/dist/issues/schema.js.map +1 -0
- package/dist/issues/sourceRevision.js +108 -0
- package/dist/issues/sourceRevision.js.map +1 -0
- package/dist/issues/store.js +155 -0
- package/dist/issues/store.js.map +1 -0
- package/dist/lib/android.js +278 -0
- package/dist/lib/android.js.map +1 -0
- package/dist/lib/commandTemplate.js +55 -0
- package/dist/lib/commandTemplate.js.map +1 -0
- package/dist/lib/coordSpace.js +23 -0
- package/dist/lib/coordSpace.js.map +1 -0
- package/dist/lib/device.js +87 -0
- package/dist/lib/device.js.map +1 -0
- package/dist/lib/gitignore.js +22 -0
- package/dist/lib/gitignore.js.map +1 -0
- package/dist/lib/image.js +97 -0
- package/dist/lib/image.js.map +1 -0
- package/dist/lib/logger.js +8 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/metroState.js +45 -0
- package/dist/lib/metroState.js.map +1 -0
- package/dist/lib/needsInput.js +201 -0
- package/dist/lib/needsInput.js.map +1 -0
- package/dist/lib/png.js +103 -0
- package/dist/lib/png.js.map +1 -0
- package/dist/lib/redact.js +21 -0
- package/dist/lib/redact.js.map +1 -0
- package/dist/lib/result.js +87 -0
- package/dist/lib/result.js.map +1 -0
- package/dist/lib/schemaHash.js +65 -0
- package/dist/lib/schemaHash.js.map +1 -0
- package/dist/lib/sensitive.js +13 -0
- package/dist/lib/sensitive.js.map +1 -0
- package/dist/lib/simctl.js +149 -0
- package/dist/lib/simctl.js.map +1 -0
- package/dist/lib/spawn.js +144 -0
- package/dist/lib/spawn.js.map +1 -0
- package/dist/lib/wda.js +347 -0
- package/dist/lib/wda.js.map +1 -0
- package/dist/lib/wdaConfig.js +69 -0
- package/dist/lib/wdaConfig.js.map +1 -0
- package/dist/lib/wdaTune.js +58 -0
- package/dist/lib/wdaTune.js.map +1 -0
- package/dist/oracle/auth.js +22 -0
- package/dist/oracle/auth.js.map +1 -0
- package/dist/oracle/failures.js +193 -0
- package/dist/oracle/failures.js.map +1 -0
- package/dist/oracle/health.js +123 -0
- package/dist/oracle/health.js.map +1 -0
- package/dist/oracle/record.js +36 -0
- package/dist/oracle/record.js.map +1 -0
- package/dist/orchestration/envelope.js +52 -0
- package/dist/orchestration/envelope.js.map +1 -0
- package/dist/orchestration/goal.js +98 -0
- package/dist/orchestration/goal.js.map +1 -0
- package/dist/plan/plan.js +124 -0
- package/dist/plan/plan.js.map +1 -0
- package/dist/prompts/index.js +63 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/report/artifactManifest.js +44 -0
- package/dist/report/artifactManifest.js.map +1 -0
- package/dist/report/coverage.js +60 -0
- package/dist/report/coverage.js.map +1 -0
- package/dist/report/evidence.js +84 -0
- package/dist/report/evidence.js.map +1 -0
- package/dist/report/export.js +447 -0
- package/dist/report/export.js.map +1 -0
- package/dist/report/flake.js +61 -0
- package/dist/report/flake.js.map +1 -0
- package/dist/report/history.js +564 -0
- package/dist/report/history.js.map +1 -0
- package/dist/report/policy.js +98 -0
- package/dist/report/policy.js.map +1 -0
- package/dist/report/qaLevel.js +96 -0
- package/dist/report/qaLevel.js.map +1 -0
- package/dist/report/readiness.js +213 -0
- package/dist/report/readiness.js.map +1 -0
- package/dist/report/summary.js +42 -0
- package/dist/report/summary.js.map +1 -0
- package/dist/report/testCatalog.js +93 -0
- package/dist/report/testCatalog.js.map +1 -0
- package/dist/report/timing.js +37 -0
- package/dist/report/timing.js.map +1 -0
- package/dist/server.js +180 -0
- package/dist/server.js.map +1 -0
- package/dist/services/automationGenerate.js +60 -0
- package/dist/services/automationGenerate.js.map +1 -0
- package/dist/services/build.js +66 -0
- package/dist/services/build.js.map +1 -0
- package/dist/services/preflight.js +51 -0
- package/dist/services/preflight.js.map +1 -0
- package/dist/services/prepareAndroid.js +183 -0
- package/dist/services/prepareAndroid.js.map +1 -0
- package/dist/services/prepareIos.js +162 -0
- package/dist/services/prepareIos.js.map +1 -0
- package/dist/services/report.js +537 -0
- package/dist/services/report.js.map +1 -0
- package/dist/services/smoke.js +120 -0
- package/dist/services/smoke.js.map +1 -0
- package/dist/services/suiteGenerate.js +123 -0
- package/dist/services/suiteGenerate.js.map +1 -0
- package/dist/services/testSuiteKnowledge.js +150 -0
- package/dist/services/testSuiteKnowledge.js.map +1 -0
- package/dist/session/attach.js +47 -0
- package/dist/session/attach.js.map +1 -0
- package/dist/session/progress.js +56 -0
- package/dist/session/progress.js.map +1 -0
- package/dist/session/store.js +329 -0
- package/dist/session/store.js.map +1 -0
- package/dist/snapshot/overlays.js +132 -0
- package/dist/snapshot/overlays.js.map +1 -0
- package/dist/snapshot/parse.js +204 -0
- package/dist/snapshot/parse.js.map +1 -0
- package/dist/snapshot/present.js +12 -0
- package/dist/snapshot/present.js.map +1 -0
- package/dist/snapshot/settle.js +36 -0
- package/dist/snapshot/settle.js.map +1 -0
- package/dist/state/profile.js +318 -0
- package/dist/state/profile.js.map +1 -0
- package/dist/suite/compile.js +176 -0
- package/dist/suite/compile.js.map +1 -0
- package/dist/suite/lint.js +45 -0
- package/dist/suite/lint.js.map +1 -0
- package/dist/suite/pom.js +285 -0
- package/dist/suite/pom.js.map +1 -0
- package/dist/suite/testcase.js +87 -0
- package/dist/suite/testcase.js.map +1 -0
- package/dist/testSuite/generator.js +222 -0
- package/dist/testSuite/generator.js.map +1 -0
- package/dist/testSuite/history.js +44 -0
- package/dist/testSuite/history.js.map +1 -0
- package/dist/testSuite/issueLinks.js +96 -0
- package/dist/testSuite/issueLinks.js.map +1 -0
- package/dist/testSuite/merge.js +190 -0
- package/dist/testSuite/merge.js.map +1 -0
- package/dist/testSuite/schema.js +86 -0
- package/dist/testSuite/schema.js.map +1 -0
- package/dist/testSuite/store.js +116 -0
- package/dist/testSuite/store.js.map +1 -0
- package/dist/testSuite/traceability.js +55 -0
- package/dist/testSuite/traceability.js.map +1 -0
- package/dist/tools/act.js +457 -0
- package/dist/tools/act.js.map +1 -0
- package/dist/tools/agent.js +225 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/appMap.js +317 -0
- package/dist/tools/appMap.js.map +1 -0
- package/dist/tools/assertVisual.js +74 -0
- package/dist/tools/assertVisual.js.map +1 -0
- package/dist/tools/automationGenerate.js +394 -0
- package/dist/tools/automationGenerate.js.map +1 -0
- package/dist/tools/capabilities.js +114 -0
- package/dist/tools/capabilities.js.map +1 -0
- package/dist/tools/clearOverlay.js +150 -0
- package/dist/tools/clearOverlay.js.map +1 -0
- package/dist/tools/detectContext.js +41 -0
- package/dist/tools/detectContext.js.map +1 -0
- package/dist/tools/doctor.js +116 -0
- package/dist/tools/doctor.js.map +1 -0
- package/dist/tools/explore.js +289 -0
- package/dist/tools/explore.js.map +1 -0
- package/dist/tools/firstRun.js +136 -0
- package/dist/tools/firstRun.js.map +1 -0
- package/dist/tools/flow.js +331 -0
- package/dist/tools/flow.js.map +1 -0
- package/dist/tools/flowGenerate.js +55 -0
- package/dist/tools/flowGenerate.js.map +1 -0
- package/dist/tools/getArtifact.js +39 -0
- package/dist/tools/getArtifact.js.map +1 -0
- package/dist/tools/health.js +41 -0
- package/dist/tools/health.js.map +1 -0
- package/dist/tools/ios.js +492 -0
- package/dist/tools/ios.js.map +1 -0
- package/dist/tools/jobs.js +20 -0
- package/dist/tools/jobs.js.map +1 -0
- package/dist/tools/network.js +50 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/note.js +69 -0
- package/dist/tools/note.js.map +1 -0
- package/dist/tools/plan.js +49 -0
- package/dist/tools/plan.js.map +1 -0
- package/dist/tools/prepareIosTarget.js +99 -0
- package/dist/tools/prepareIosTarget.js.map +1 -0
- package/dist/tools/prepareTarget.js +257 -0
- package/dist/tools/prepareTarget.js.map +1 -0
- package/dist/tools/report.js +42 -0
- package/dist/tools/report.js.map +1 -0
- package/dist/tools/screenRecord.js +24 -0
- package/dist/tools/screenRecord.js.map +1 -0
- package/dist/tools/screenshot.js +63 -0
- package/dist/tools/screenshot.js.map +1 -0
- package/dist/tools/smoke.js +39 -0
- package/dist/tools/smoke.js.map +1 -0
- package/dist/tools/snapshot.js +129 -0
- package/dist/tools/snapshot.js.map +1 -0
- package/dist/tools/startSession.js +169 -0
- package/dist/tools/startSession.js.map +1 -0
- package/dist/tools/state.js +87 -0
- package/dist/tools/state.js.map +1 -0
- package/dist/tools/suite.js +412 -0
- package/dist/tools/suite.js.map +1 -0
- package/dist/tools/testThis.js +774 -0
- package/dist/tools/testThis.js.map +1 -0
- package/dist/tools/wda.js +477 -0
- package/dist/tools/wda.js.map +1 -0
- package/dist/version.js +62 -0
- package/dist/version.js.map +1 -0
- package/dist/visual/ocr.js +72 -0
- package/dist/visual/ocr.js.map +1 -0
- package/dist/visual/provider.js +75 -0
- package/dist/visual/provider.js.map +1 -0
- package/docs/README.md +19 -0
- package/docs/assets/swipium-lockup-ink-on-light.png +0 -0
- package/docs/mcp-server.md +135 -0
- package/docs/tools.md +130 -0
- package/package.json +70 -0
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { evidenceTaxonomyForNotes } from './evidence.js';
|
|
4
|
+
export function loadReport(path) {
|
|
5
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
6
|
+
}
|
|
7
|
+
function outcomeMap(r) {
|
|
8
|
+
return new Map(r.testOutcomes.map((o) => [o.workflow, o.outcome]));
|
|
9
|
+
}
|
|
10
|
+
function failureKeys(r) {
|
|
11
|
+
const fromOutcomes = r.testOutcomes
|
|
12
|
+
.filter((o) => o.outcome === 'fail' || o.outcome === 'blocked')
|
|
13
|
+
.map((o) => `${o.workflow}: ${o.reason ?? o.missingPrecondition ?? o.category ?? o.outcome}`);
|
|
14
|
+
const fromFindings = r.findings
|
|
15
|
+
.filter((f) => f.severity === 'high')
|
|
16
|
+
.map((f) => `${f.kind}: ${f.detail}`);
|
|
17
|
+
return [...fromOutcomes, ...fromFindings].sort();
|
|
18
|
+
}
|
|
19
|
+
function screenshotUris(r) {
|
|
20
|
+
const direct = r.artifacts
|
|
21
|
+
.filter((a) => a.kind === 'screenshot')
|
|
22
|
+
.map((a) => a.uri);
|
|
23
|
+
const fromOutcomes = r.testOutcomes.flatMap((o) => o.artifactUris ?? []).filter((uri) => /\.(png|jpg|jpeg|webp)(\?|$)/i.test(uri) || /\/screenshot\//i.test(uri));
|
|
24
|
+
return [...new Set([...direct, ...fromOutcomes])].sort();
|
|
25
|
+
}
|
|
26
|
+
function workflowFromFailureKey(failure) {
|
|
27
|
+
const m = failure.match(/^([^:]+):\s/);
|
|
28
|
+
return m ? m[1] : null;
|
|
29
|
+
}
|
|
30
|
+
export function compareReports(currentPath, baselinePath, opts = {}) {
|
|
31
|
+
const current = loadReport(currentPath);
|
|
32
|
+
const baseline = loadReport(baselinePath);
|
|
33
|
+
const curFailures = failureKeys(current);
|
|
34
|
+
const baseFailures = failureKeys(baseline);
|
|
35
|
+
const currentSet = new Set(curFailures);
|
|
36
|
+
const baseSet = new Set(baseFailures);
|
|
37
|
+
const newFailures = curFailures.filter((f) => !baseSet.has(f));
|
|
38
|
+
const fixedFailures = baseFailures.filter((f) => !currentSet.has(f));
|
|
39
|
+
const trend = opts.trendRoot ? trendForRoot(opts.trendRoot) : null;
|
|
40
|
+
const knownFlakyFailures = trend
|
|
41
|
+
? newFailures.filter((f) => {
|
|
42
|
+
const workflow = workflowFromFailureKey(f);
|
|
43
|
+
return workflow ? trend.flakyFlows.includes(workflow) : false;
|
|
44
|
+
})
|
|
45
|
+
: [];
|
|
46
|
+
const flakeStatus = trend ? (knownFlakyFailures.length ? 'known_flaky' : 'not_flaky') : 'not_checked';
|
|
47
|
+
const curOut = outcomeMap(current);
|
|
48
|
+
const baseOut = outcomeMap(baseline);
|
|
49
|
+
const changedOutcomes = [];
|
|
50
|
+
for (const [workflow, to] of curOut) {
|
|
51
|
+
const from = baseOut.get(workflow);
|
|
52
|
+
if (from && from !== to)
|
|
53
|
+
changedOutcomes.push({ workflow, from, to });
|
|
54
|
+
}
|
|
55
|
+
const curScreenshots = screenshotUris(current);
|
|
56
|
+
const baseScreenshots = screenshotUris(baseline);
|
|
57
|
+
const currentScreenshots = new Set(curScreenshots);
|
|
58
|
+
const baselineScreenshots = new Set(baseScreenshots);
|
|
59
|
+
const changedScreenshots = {
|
|
60
|
+
added: curScreenshots.filter((uri) => !baselineScreenshots.has(uri)),
|
|
61
|
+
removed: baseScreenshots.filter((uri) => !currentScreenshots.has(uri)),
|
|
62
|
+
};
|
|
63
|
+
const curTime = current.phaseTimings.totalSec;
|
|
64
|
+
const baseTime = baseline.phaseTimings.totalSec;
|
|
65
|
+
const runtimeRegressionSec = curTime != null && baseTime != null && curTime > baseTime ? Number((curTime - baseTime).toFixed(2)) : null;
|
|
66
|
+
const summary = newFailures.length
|
|
67
|
+
? `BLOCK: ${newFailures.length} new failure(s)`
|
|
68
|
+
: fixedFailures.length
|
|
69
|
+
? `IMPROVED: ${fixedFailures.length} failure(s) fixed`
|
|
70
|
+
: runtimeRegressionSec
|
|
71
|
+
? `CAUTION: runtime regressed by ${runtimeRegressionSec}s`
|
|
72
|
+
: 'UNCHANGED: no new failures';
|
|
73
|
+
return {
|
|
74
|
+
current: currentPath,
|
|
75
|
+
baseline: baselinePath,
|
|
76
|
+
newFailures,
|
|
77
|
+
fixedFailures,
|
|
78
|
+
knownFlakyFailures,
|
|
79
|
+
flakeStatus,
|
|
80
|
+
changedScreenshots,
|
|
81
|
+
changedOutcomes,
|
|
82
|
+
runtimeRegressionSec,
|
|
83
|
+
failureCodeDelta: { current: curFailures, baseline: baseFailures },
|
|
84
|
+
summary,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function firstProblem(r) {
|
|
88
|
+
const failed = r.testOutcomes.find((o) => o.outcome === 'fail' || o.outcome === 'blocked');
|
|
89
|
+
if (failed) {
|
|
90
|
+
return {
|
|
91
|
+
workflow: failed.workflow,
|
|
92
|
+
reason: failed.reason ?? failed.missingPrecondition ?? failed.category ?? failed.outcome,
|
|
93
|
+
category: failed.category,
|
|
94
|
+
evidence: failed.artifactUris ?? [],
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const high = r.findings.find((f) => f.severity === 'high') ?? r.findings[0];
|
|
98
|
+
if (!high)
|
|
99
|
+
return null;
|
|
100
|
+
return {
|
|
101
|
+
reason: high.detail,
|
|
102
|
+
category: high.kind,
|
|
103
|
+
evidence: [high.screenshotUri].filter((x) => !!x),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function likelyCategory(problem, report) {
|
|
107
|
+
const raw = `${problem?.category ?? ''} ${problem?.reason ?? ''}`.toLowerCase();
|
|
108
|
+
if (/accessibility|identifier|locator|element|not found|continue missing/.test(raw))
|
|
109
|
+
return 'automation readiness';
|
|
110
|
+
if (/network|device|wda|simulator|emulator|install|seed|fixture|toolchain|permission/.test(raw))
|
|
111
|
+
return 'environment/setup';
|
|
112
|
+
if (report.appHealth !== 'OK' || /assert|visible|expected|crash|errorboundary|redbox/.test(raw))
|
|
113
|
+
return 'app regression';
|
|
114
|
+
return 'unknown';
|
|
115
|
+
}
|
|
116
|
+
function evidenceList(report, problem) {
|
|
117
|
+
const fromProblem = problem?.evidence ?? [];
|
|
118
|
+
const fromArtifacts = report.artifacts.map((a) => a.uri).slice(0, 5);
|
|
119
|
+
return [...new Set([...fromProblem, ...fromArtifacts])];
|
|
120
|
+
}
|
|
121
|
+
export function buildPrSummary(currentPath, opts = {}) {
|
|
122
|
+
const report = loadReport(currentPath);
|
|
123
|
+
const problem = firstProblem(report);
|
|
124
|
+
const cmp = opts.baselinePath ? compareReports(currentPath, opts.baselinePath, { trendRoot: opts.trendRoot }) : null;
|
|
125
|
+
const trend = opts.trendRoot ? trendForRoot(opts.trendRoot) : null;
|
|
126
|
+
const knownFlaky = !!(problem?.workflow && trend?.flakyFlows.includes(problem.workflow));
|
|
127
|
+
const hasNewFailure = !!cmp?.newFailures.length;
|
|
128
|
+
const status = report.executiveSummary.risk === 'block' || hasNewFailure || (problem && !knownFlaky)
|
|
129
|
+
? 'BLOCK'
|
|
130
|
+
: report.executiveSummary.risk === 'caution' || knownFlaky || !!cmp?.runtimeRegressionSec
|
|
131
|
+
? 'CAUTION'
|
|
132
|
+
: 'SHIP';
|
|
133
|
+
const reason = problem
|
|
134
|
+
? `${problem.workflow ? `${problem.workflow}: ` : ''}${problem.reason}`
|
|
135
|
+
: report.executiveSummary.reasons[0] ?? 'No blocking failures detected.';
|
|
136
|
+
const category = likelyCategory(problem, report);
|
|
137
|
+
const classification = knownFlaky
|
|
138
|
+
? 'known_flaky_flow'
|
|
139
|
+
: hasNewFailure && category === 'app regression'
|
|
140
|
+
? 'new_app_regression'
|
|
141
|
+
: hasNewFailure && category === 'environment/setup'
|
|
142
|
+
? 'new_environment_failure'
|
|
143
|
+
: category === 'automation readiness' && problem
|
|
144
|
+
? 'automation_readiness'
|
|
145
|
+
: cmp?.runtimeRegressionSec != null
|
|
146
|
+
? 'runtime_regression'
|
|
147
|
+
: 'clean';
|
|
148
|
+
const evidence = evidenceList(report, problem);
|
|
149
|
+
const comparison = cmp
|
|
150
|
+
? cmp.newFailures.length
|
|
151
|
+
? `${cmp.newFailures.length} new failure(s) versus baseline`
|
|
152
|
+
: cmp.fixedFailures.length
|
|
153
|
+
? `${cmp.fixedFailures.length} failure(s) fixed versus baseline`
|
|
154
|
+
: cmp.runtimeRegressionSec != null
|
|
155
|
+
? `runtime regressed by ${cmp.runtimeRegressionSec}s versus baseline`
|
|
156
|
+
: 'no new failures versus baseline'
|
|
157
|
+
: undefined;
|
|
158
|
+
const nextAction = problem
|
|
159
|
+
? category === 'automation readiness'
|
|
160
|
+
? 'Add a durable accessibilityIdentifier/testID or update the flow locator.'
|
|
161
|
+
: report.executiveSummary.nextAction
|
|
162
|
+
: report.executiveSummary.nextAction;
|
|
163
|
+
const lines = [
|
|
164
|
+
`Swipium: ${status}`,
|
|
165
|
+
`Reason: ${reason}${knownFlaky ? ' (known flaky in local trend history)' : ''}.`,
|
|
166
|
+
`Native health: ${report.nativeHealth}. App health: ${report.appHealth}.`,
|
|
167
|
+
`Likely category: ${category}.`,
|
|
168
|
+
`Classification: ${classification.replaceAll('_', ' ')}.`,
|
|
169
|
+
comparison ? `Comparison: ${comparison}.` : '',
|
|
170
|
+
`Evidence: ${evidence.length ? evidence.join(', ') : 'none recorded'}.`,
|
|
171
|
+
`Next action: ${nextAction}`,
|
|
172
|
+
].filter(Boolean);
|
|
173
|
+
return {
|
|
174
|
+
status,
|
|
175
|
+
classification,
|
|
176
|
+
reason,
|
|
177
|
+
nativeHealth: report.nativeHealth,
|
|
178
|
+
appHealth: report.appHealth,
|
|
179
|
+
likelyCategory: category,
|
|
180
|
+
evidence,
|
|
181
|
+
nextAction,
|
|
182
|
+
comparison,
|
|
183
|
+
knownFlaky,
|
|
184
|
+
text: lines.join('\n'),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function median(nums) {
|
|
188
|
+
if (!nums.length)
|
|
189
|
+
return null;
|
|
190
|
+
const sorted = [...nums].sort((a, b) => a - b);
|
|
191
|
+
const mid = Math.floor(sorted.length / 2);
|
|
192
|
+
return sorted.length % 2 ? sorted[mid] : Number(((sorted[mid - 1] + sorted[mid]) / 2).toFixed(2));
|
|
193
|
+
}
|
|
194
|
+
function average(nums) {
|
|
195
|
+
return nums.length ? round(nums.reduce((sum, n) => sum + n, 0) / nums.length, 2) : null;
|
|
196
|
+
}
|
|
197
|
+
const PROBABILISTIC_KINDS = ['ocr_locator', 'visual_match', 'ai_visual_evidence'];
|
|
198
|
+
const CALIBRATION_BUCKETS = [
|
|
199
|
+
{ label: '0.00-0.49', min: 0, max: 0.49 },
|
|
200
|
+
{ label: '0.50-0.69', min: 0.5, max: 0.69 },
|
|
201
|
+
{ label: '0.70-0.84', min: 0.7, max: 0.84 },
|
|
202
|
+
{ label: '0.85-0.94', min: 0.85, max: 0.94 },
|
|
203
|
+
{ label: '0.95-1.00', min: 0.95, max: 1 },
|
|
204
|
+
];
|
|
205
|
+
const MIN_CALIBRATION_OUTCOMES = 10;
|
|
206
|
+
const MIN_BUCKET_OUTCOMES = 3;
|
|
207
|
+
const MAX_CALIBRATION_ERROR = 0.15;
|
|
208
|
+
function round(n, places = 3) {
|
|
209
|
+
return Number(n.toFixed(places));
|
|
210
|
+
}
|
|
211
|
+
function isProbabilisticKind(kind) {
|
|
212
|
+
return typeof kind === 'string' && PROBABILISTIC_KINDS.includes(kind);
|
|
213
|
+
}
|
|
214
|
+
function asRecord(value) {
|
|
215
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
216
|
+
}
|
|
217
|
+
function normalizeConfidence(value) {
|
|
218
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value < 0)
|
|
219
|
+
return null;
|
|
220
|
+
const normalized = value <= 1 ? value : value <= 100 ? value / 100 : null;
|
|
221
|
+
return normalized == null ? null : round(Math.min(1, Math.max(0, normalized)));
|
|
222
|
+
}
|
|
223
|
+
function confidenceFromRecord(record) {
|
|
224
|
+
return normalizeConfidence(record.confidence) ?? normalizeConfidence(record.score) ?? normalizeConfidence(record.probability);
|
|
225
|
+
}
|
|
226
|
+
function outcomeFromRecord(record) {
|
|
227
|
+
for (const key of ['outcome', 'decision', 'status']) {
|
|
228
|
+
const raw = record[key];
|
|
229
|
+
if (typeof raw !== 'string')
|
|
230
|
+
continue;
|
|
231
|
+
const value = raw.toLowerCase();
|
|
232
|
+
if (['pass', 'passed', 'ok', 'success'].includes(value))
|
|
233
|
+
return 'pass';
|
|
234
|
+
if (['fail', 'failed', 'error', 'timedout', 'timed_out', 'timeout'].includes(value))
|
|
235
|
+
return 'fail';
|
|
236
|
+
}
|
|
237
|
+
for (const key of ['pass', 'passed', 'ok']) {
|
|
238
|
+
const value = record[key];
|
|
239
|
+
if (typeof value === 'boolean')
|
|
240
|
+
return value ? 'pass' : 'fail';
|
|
241
|
+
}
|
|
242
|
+
return 'unknown';
|
|
243
|
+
}
|
|
244
|
+
function emptyAccumulator() {
|
|
245
|
+
return {
|
|
246
|
+
evidence: 0,
|
|
247
|
+
confidenceSamples: 0,
|
|
248
|
+
missingConfidence: 0,
|
|
249
|
+
passed: 0,
|
|
250
|
+
failed: 0,
|
|
251
|
+
unknown: 0,
|
|
252
|
+
confidenceSum: 0,
|
|
253
|
+
outcomeConfidenceSum: 0,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
function addObservation(acc, obs) {
|
|
257
|
+
acc.evidence++;
|
|
258
|
+
if (obs.confidence == null) {
|
|
259
|
+
acc.missingConfidence++;
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
acc.confidenceSamples++;
|
|
263
|
+
acc.confidenceSum += obs.confidence;
|
|
264
|
+
if (obs.outcome === 'pass') {
|
|
265
|
+
acc.passed++;
|
|
266
|
+
acc.outcomeConfidenceSum += obs.confidence;
|
|
267
|
+
}
|
|
268
|
+
else if (obs.outcome === 'fail') {
|
|
269
|
+
acc.failed++;
|
|
270
|
+
acc.outcomeConfidenceSum += obs.confidence;
|
|
271
|
+
}
|
|
272
|
+
else {
|
|
273
|
+
acc.unknown++;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function accumulatorSummary(acc) {
|
|
277
|
+
const outcomeSamples = acc.passed + acc.failed;
|
|
278
|
+
const passRate = outcomeSamples ? round(acc.passed / outcomeSamples) : null;
|
|
279
|
+
const averageConfidence = acc.confidenceSamples ? round(acc.confidenceSum / acc.confidenceSamples) : null;
|
|
280
|
+
const expectedConfidence = outcomeSamples ? round(acc.outcomeConfidenceSum / outcomeSamples) : averageConfidence;
|
|
281
|
+
return {
|
|
282
|
+
evidence: acc.evidence,
|
|
283
|
+
confidenceSamples: acc.confidenceSamples,
|
|
284
|
+
missingConfidence: acc.missingConfidence,
|
|
285
|
+
outcomeSamples,
|
|
286
|
+
passRate,
|
|
287
|
+
averageConfidence,
|
|
288
|
+
calibrationError: passRate != null && expectedConfidence != null ? round(Math.abs(expectedConfidence - passRate)) : null,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
function bucketForConfidence(confidence) {
|
|
292
|
+
if (confidence < 0.5)
|
|
293
|
+
return CALIBRATION_BUCKETS[0];
|
|
294
|
+
if (confidence < 0.7)
|
|
295
|
+
return CALIBRATION_BUCKETS[1];
|
|
296
|
+
if (confidence < 0.85)
|
|
297
|
+
return CALIBRATION_BUCKETS[2];
|
|
298
|
+
if (confidence < 0.95)
|
|
299
|
+
return CALIBRATION_BUCKETS[3];
|
|
300
|
+
return CALIBRATION_BUCKETS[4];
|
|
301
|
+
}
|
|
302
|
+
function confidenceObservationsForReport(file, report) {
|
|
303
|
+
const taxonomy = report.evidenceTaxonomy ?? evidenceTaxonomyForNotes(report.testOutcomes);
|
|
304
|
+
const notesByWorkflow = new Map();
|
|
305
|
+
for (const note of report.testOutcomes)
|
|
306
|
+
notesByWorkflow.set(note.workflow, [...(notesByWorkflow.get(note.workflow) ?? []), note]);
|
|
307
|
+
const observations = [];
|
|
308
|
+
for (const assessment of taxonomy.assessments) {
|
|
309
|
+
if (!isProbabilisticKind(assessment.kind))
|
|
310
|
+
continue;
|
|
311
|
+
const matchingNotes = notesByWorkflow.get(assessment.workflow) ?? [];
|
|
312
|
+
const note = matchingNotes.shift();
|
|
313
|
+
const assessmentRecord = asRecord(assessment);
|
|
314
|
+
const noteRecord = asRecord(note);
|
|
315
|
+
observations.push({
|
|
316
|
+
file,
|
|
317
|
+
workflow: assessment.workflow,
|
|
318
|
+
kind: assessment.kind,
|
|
319
|
+
outcome: outcomeFromRecord(assessmentRecord) !== 'unknown' ? outcomeFromRecord(assessmentRecord) : outcomeFromRecord(noteRecord),
|
|
320
|
+
confidence: confidenceFromRecord(assessmentRecord) ?? confidenceFromRecord(noteRecord),
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
return observations;
|
|
324
|
+
}
|
|
325
|
+
function calibrationNote(status, warnings) {
|
|
326
|
+
if (status === 'not_required')
|
|
327
|
+
return 'No probabilistic visual/OCR/AI visual evidence was recorded in the history.';
|
|
328
|
+
if (status === 'insufficient_data')
|
|
329
|
+
return warnings[0] ?? 'More dogfood-nightly confidence samples are required before calibration can be trusted.';
|
|
330
|
+
if (status === 'needs_attention')
|
|
331
|
+
return warnings[0] ?? 'Confidence calibration is available but has reliability warnings.';
|
|
332
|
+
return 'Probabilistic confidence values are paired with enough dogfood outcomes and no calibration warning crossed the configured thresholds.';
|
|
333
|
+
}
|
|
334
|
+
function confidenceCalibrationForReports(reports) {
|
|
335
|
+
const observations = reports.flatMap(({ file, report }) => confidenceObservationsForReport(file, report));
|
|
336
|
+
const overall = emptyAccumulator();
|
|
337
|
+
const byKindAcc = Object.fromEntries(PROBABILISTIC_KINDS.map((kind) => [kind, emptyAccumulator()]));
|
|
338
|
+
const bucketAcc = new Map();
|
|
339
|
+
for (const b of CALIBRATION_BUCKETS)
|
|
340
|
+
bucketAcc.set(b.label, emptyAccumulator());
|
|
341
|
+
for (const obs of observations) {
|
|
342
|
+
addObservation(overall, obs);
|
|
343
|
+
addObservation(byKindAcc[obs.kind], obs);
|
|
344
|
+
if (obs.confidence != null)
|
|
345
|
+
addObservation(bucketAcc.get(bucketForConfidence(obs.confidence).label), obs);
|
|
346
|
+
}
|
|
347
|
+
const overallSummary = accumulatorSummary(overall);
|
|
348
|
+
const buckets = CALIBRATION_BUCKETS.map((bucket) => {
|
|
349
|
+
const acc = bucketAcc.get(bucket.label);
|
|
350
|
+
const summary = accumulatorSummary(acc);
|
|
351
|
+
return {
|
|
352
|
+
label: bucket.label,
|
|
353
|
+
min: bucket.min,
|
|
354
|
+
max: bucket.max,
|
|
355
|
+
samples: acc.confidenceSamples,
|
|
356
|
+
passed: acc.passed,
|
|
357
|
+
failed: acc.failed,
|
|
358
|
+
unknown: acc.unknown,
|
|
359
|
+
averageConfidence: summary.averageConfidence,
|
|
360
|
+
observedPassRate: summary.passRate,
|
|
361
|
+
calibrationError: summary.calibrationError,
|
|
362
|
+
};
|
|
363
|
+
});
|
|
364
|
+
const warnings = [];
|
|
365
|
+
if (overall.missingConfidence)
|
|
366
|
+
warnings.push(`${overall.missingConfidence} probabilistic evidence item(s) did not record confidence.`);
|
|
367
|
+
if (overall.evidence && !overall.confidenceSamples)
|
|
368
|
+
warnings.push('No probabilistic evidence had a numeric confidence value.');
|
|
369
|
+
if (overall.evidence && overallSummary.outcomeSamples < MIN_CALIBRATION_OUTCOMES) {
|
|
370
|
+
warnings.push(`Only ${overallSummary.outcomeSamples} pass/fail outcome sample(s) are paired with confidence; ${MIN_CALIBRATION_OUTCOMES} are required for calibration.`);
|
|
371
|
+
}
|
|
372
|
+
if (overallSummary.outcomeSamples >= MIN_CALIBRATION_OUTCOMES && overallSummary.calibrationError != null && overallSummary.calibrationError > MAX_CALIBRATION_ERROR) {
|
|
373
|
+
warnings.push(`Observed pass rate differs from average confidence by ${overallSummary.calibrationError}.`);
|
|
374
|
+
}
|
|
375
|
+
for (const bucket of buckets) {
|
|
376
|
+
const bucketOutcomes = bucket.passed + bucket.failed;
|
|
377
|
+
if (bucket.min >= 0.85 && bucketOutcomes >= MIN_BUCKET_OUTCOMES && bucket.observedPassRate != null && bucket.observedPassRate < 0.9) {
|
|
378
|
+
warnings.push(`High-confidence bucket ${bucket.label} passed only ${(bucket.observedPassRate * 100).toFixed(1)}% of ${bucketOutcomes} outcome sample(s).`);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
const status = !overall.evidence
|
|
382
|
+
? 'not_required'
|
|
383
|
+
: !overall.confidenceSamples || overallSummary.outcomeSamples < MIN_CALIBRATION_OUTCOMES
|
|
384
|
+
? 'insufficient_data'
|
|
385
|
+
: warnings.length
|
|
386
|
+
? 'needs_attention'
|
|
387
|
+
: 'calibrated';
|
|
388
|
+
return {
|
|
389
|
+
schema: 'swipium.confidence.calibration.v1',
|
|
390
|
+
status,
|
|
391
|
+
requiredCorpus: 'dogfood-nightly',
|
|
392
|
+
reports: reports.length,
|
|
393
|
+
probabilisticEvidence: overall.evidence,
|
|
394
|
+
confidenceSamples: overall.confidenceSamples,
|
|
395
|
+
missingConfidence: overall.missingConfidence,
|
|
396
|
+
outcomeSamples: overallSummary.outcomeSamples,
|
|
397
|
+
passRate: overallSummary.passRate,
|
|
398
|
+
averageConfidence: overallSummary.averageConfidence,
|
|
399
|
+
calibrationError: overallSummary.calibrationError,
|
|
400
|
+
byEvidenceKind: Object.fromEntries(PROBABILISTIC_KINDS.map((kind) => [kind, accumulatorSummary(byKindAcc[kind])])),
|
|
401
|
+
buckets,
|
|
402
|
+
warnings,
|
|
403
|
+
note: calibrationNote(status, warnings),
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
export function findReportJsonFiles(root) {
|
|
407
|
+
const out = [];
|
|
408
|
+
const walk = (dir) => {
|
|
409
|
+
for (const ent of readdirSync(dir, { withFileTypes: true })) {
|
|
410
|
+
const p = join(dir, ent.name);
|
|
411
|
+
if (ent.isDirectory())
|
|
412
|
+
walk(p);
|
|
413
|
+
else if (ent.isFile() && ent.name === 'report.json')
|
|
414
|
+
out.push(p);
|
|
415
|
+
}
|
|
416
|
+
};
|
|
417
|
+
for (const base of [join(root, '.swipium', 'runs'), join(root, '.swipium', 'ci')]) {
|
|
418
|
+
if (existsSync(base))
|
|
419
|
+
walk(base);
|
|
420
|
+
}
|
|
421
|
+
return out.sort();
|
|
422
|
+
}
|
|
423
|
+
export function trendForReports(files) {
|
|
424
|
+
const reports = files.map((f) => ({ file: f, report: loadReport(f) }));
|
|
425
|
+
const byFlow = new Map();
|
|
426
|
+
const byContext = new Map();
|
|
427
|
+
const codeCounts = new Map();
|
|
428
|
+
const envCounts = new Map();
|
|
429
|
+
const times = [];
|
|
430
|
+
const setupTimes = [];
|
|
431
|
+
const activeTimes = [];
|
|
432
|
+
const stepTimes = [];
|
|
433
|
+
const releaseSignals = new Map();
|
|
434
|
+
let wdaReports = 0;
|
|
435
|
+
let wdaReachable = 0;
|
|
436
|
+
let wdaReady = 0;
|
|
437
|
+
let onlineAtEnd = 0;
|
|
438
|
+
let visualOnlyRuns = 0;
|
|
439
|
+
let coordinateOnlyWarnings = 0;
|
|
440
|
+
const locatorRuns = [];
|
|
441
|
+
const addReleaseSignal = (level, code, policy, example) => {
|
|
442
|
+
const existing = releaseSignals.get(code);
|
|
443
|
+
if (existing) {
|
|
444
|
+
existing.count++;
|
|
445
|
+
if (existing.examples.length < 5 && !existing.examples.includes(example))
|
|
446
|
+
existing.examples.push(example);
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
releaseSignals.set(code, { level, code, count: 1, policy, examples: [example] });
|
|
450
|
+
};
|
|
451
|
+
for (const { file, report } of reports) {
|
|
452
|
+
if (report.phaseTimings.totalSec != null)
|
|
453
|
+
times.push(report.phaseTimings.totalSec);
|
|
454
|
+
if (report.phaseTimings.setupSec != null)
|
|
455
|
+
setupTimes.push(report.phaseTimings.setupSec);
|
|
456
|
+
if (report.phaseTimings.activeSec != null)
|
|
457
|
+
activeTimes.push(report.phaseTimings.activeSec);
|
|
458
|
+
for (const o of report.testOutcomes) {
|
|
459
|
+
byFlow.set(o.workflow, [...(byFlow.get(o.workflow) ?? []), o.outcome]);
|
|
460
|
+
const contextKey = `${report.appId ?? 'unknown'}|${report.device ?? 'device'}|${report.automationBackend?.kind ?? 'unknown'}`;
|
|
461
|
+
byContext.set(contextKey, [...(byContext.get(contextKey) ?? []), o.outcome]);
|
|
462
|
+
for (const step of o.steps ?? []) {
|
|
463
|
+
if (step.durationSec == null)
|
|
464
|
+
continue;
|
|
465
|
+
stepTimes.push({ file, workflow: o.workflow, index: step.index, kind: step.kind, summary: step.summary, durationSec: step.durationSec });
|
|
466
|
+
}
|
|
467
|
+
if (o.outcome === 'fail') {
|
|
468
|
+
const code = o.category ?? o.reason ?? 'fail';
|
|
469
|
+
codeCounts.set(code, (codeCounts.get(code) ?? 0) + 1);
|
|
470
|
+
}
|
|
471
|
+
if (o.outcome === 'fail' || o.outcome === 'blocked') {
|
|
472
|
+
addReleaseSignal('block', 'REQUIRED_WORKFLOW_FAILED', 'Block release when a required workflow fails or is blocked.', `${o.workflow}: ${o.reason ?? o.missingPrecondition ?? o.category ?? o.outcome}`);
|
|
473
|
+
}
|
|
474
|
+
if (o.outcome === 'pass' && (o.method === 'visual' || o.verifiedVisually || o.evidenceKind === 'ocr_locator' || o.evidenceKind === 'visual_match' || o.evidenceKind === 'ai_visual_evidence')) {
|
|
475
|
+
addReleaseSignal('warn', 'VISUAL_ONLY_PASS', 'Warn when a passing workflow is proven only by visual/OCR/AI evidence.', `${o.workflow}: ${o.evidenceKind ?? o.method ?? 'visual evidence'}`);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
for (const f of report.findings) {
|
|
479
|
+
if (f.failureCode)
|
|
480
|
+
codeCounts.set(f.failureCode, (codeCounts.get(f.failureCode) ?? 0) + 1);
|
|
481
|
+
if (f.layer === 'native' || /device|install|network|foreground|seed|toolchain/i.test(f.kind)) {
|
|
482
|
+
envCounts.set(f.kind, (envCounts.get(f.kind) ?? 0) + 1);
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
if (report.appHealth !== 'OK' || report.findings.some((f) => f.layer === 'app' && f.severity === 'high')) {
|
|
486
|
+
addReleaseSignal('block', 'APP_ERROR', 'Block release on app-layer health errors or high-severity app findings.', `${file}: appHealth=${report.appHealth}`);
|
|
487
|
+
}
|
|
488
|
+
const readinessLabels = report.automationReadiness?.labels ?? [];
|
|
489
|
+
if ((readinessLabels.includes('generated') || readinessLabels.includes('compiled')) && !readinessLabels.includes('replayed') && !readinessLabels.includes('ci_ready')) {
|
|
490
|
+
addReleaseSignal('warn', 'GENERATED_SUITE_NOT_REPLAYED', 'Warn when generated or compiled suites have not replayed from declared state.', `${file}: labels=${readinessLabels.join(',')}`);
|
|
491
|
+
}
|
|
492
|
+
if (report.wda) {
|
|
493
|
+
wdaReports++;
|
|
494
|
+
if (report.wda.status?.reachable)
|
|
495
|
+
wdaReachable++;
|
|
496
|
+
if (report.wda.status?.ready !== false && report.wda.status?.reachable)
|
|
497
|
+
wdaReady++;
|
|
498
|
+
}
|
|
499
|
+
if (report.finalNetwork === 'online')
|
|
500
|
+
onlineAtEnd++;
|
|
501
|
+
if (report.visualOnly)
|
|
502
|
+
visualOnlyRuns++;
|
|
503
|
+
coordinateOnlyWarnings += report.findings.filter((f) => /COORDINATE_ONLY|coordinate/i.test(`${f.failureCode ?? ''} ${f.kind} ${f.detail}`)).length;
|
|
504
|
+
if (report.automationReadiness?.locatorCoverage) {
|
|
505
|
+
const coverage = report.automationReadiness.locatorCoverage;
|
|
506
|
+
locatorRuns.push({
|
|
507
|
+
file,
|
|
508
|
+
grade: report.automationReadiness.grade,
|
|
509
|
+
durablePct: coverage.durablePct,
|
|
510
|
+
nativeOrDurablePct: coverage.nativeOrDurablePct,
|
|
511
|
+
totalActions: coverage.totalActions,
|
|
512
|
+
weakActions: coverage.textActions + coverage.coordinateActions,
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
const passRate = {};
|
|
517
|
+
const flakyFlows = [];
|
|
518
|
+
for (const [flow, outcomes] of byFlow) {
|
|
519
|
+
const passes = outcomes.filter((o) => o === 'pass').length;
|
|
520
|
+
passRate[flow] = Number((passes / outcomes.length).toFixed(3));
|
|
521
|
+
if (new Set(outcomes).size > 1)
|
|
522
|
+
flakyFlows.push(flow);
|
|
523
|
+
}
|
|
524
|
+
const passRateByAppPlatformBackend = {};
|
|
525
|
+
for (const [key, outcomes] of byContext) {
|
|
526
|
+
const passes = outcomes.filter((o) => o === 'pass').length;
|
|
527
|
+
passRateByAppPlatformBackend[key] = Number((passes / outcomes.length).toFixed(3));
|
|
528
|
+
}
|
|
529
|
+
const top = (m) => [...m.entries()].sort((a, b) => b[1] - a[1]).slice(0, 10).map(([code, count]) => ({ code, count }));
|
|
530
|
+
return {
|
|
531
|
+
reports: reports.length,
|
|
532
|
+
passRate,
|
|
533
|
+
passRateByAppPlatformBackend,
|
|
534
|
+
medianRuntimeSec: median(times),
|
|
535
|
+
averageSetupSec: average(setupTimes),
|
|
536
|
+
averageActiveSec: average(activeTimes),
|
|
537
|
+
topFailureCodes: top(codeCounts),
|
|
538
|
+
topEnvironmentFailures: top(envCounts).map(({ code, count }) => ({ kind: code, count })),
|
|
539
|
+
flakyFlows: flakyFlows.sort(),
|
|
540
|
+
wdaReliability: { reports: wdaReports, reachable: wdaReachable, ready: wdaReady },
|
|
541
|
+
emulatorReliability: { reports: reports.length, onlineAtEnd },
|
|
542
|
+
locatorReadinessTrend: {
|
|
543
|
+
visualOnlyRuns,
|
|
544
|
+
coordinateOnlyWarnings,
|
|
545
|
+
runsWithReadiness: locatorRuns.length,
|
|
546
|
+
latestDurablePct: locatorRuns[locatorRuns.length - 1]?.durablePct ?? null,
|
|
547
|
+
averageDurablePct: average(locatorRuns.map((r) => r.durablePct)),
|
|
548
|
+
minimumDurablePct: locatorRuns.length ? Math.min(...locatorRuns.map((r) => r.durablePct)) : null,
|
|
549
|
+
runs: locatorRuns,
|
|
550
|
+
},
|
|
551
|
+
releaseGateSignals: [...releaseSignals.values()].sort((a, b) => (a.level === b.level ? b.count - a.count : a.level === 'block' ? -1 : 1)),
|
|
552
|
+
confidenceCalibration: confidenceCalibrationForReports(reports),
|
|
553
|
+
slowestRuns: reports
|
|
554
|
+
.filter((r) => r.report.phaseTimings.totalSec != null)
|
|
555
|
+
.map((r) => ({ file: r.file, totalSec: r.report.phaseTimings.totalSec }))
|
|
556
|
+
.sort((a, b) => b.totalSec - a.totalSec)
|
|
557
|
+
.slice(0, 10),
|
|
558
|
+
slowestSteps: stepTimes.sort((a, b) => b.durationSec - a.durationSec).slice(0, 10),
|
|
559
|
+
};
|
|
560
|
+
}
|
|
561
|
+
export function trendForRoot(root) {
|
|
562
|
+
return trendForReports(findReportJsonFiles(root));
|
|
563
|
+
}
|
|
564
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/report/history.ts"],"names":[],"mappings":"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"}
|