@jevitate/cli 0.1.0 → 0.3.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/README.md +23 -0
- package/dist/ai-cli.d.ts +31 -11
- package/dist/ai-cli.js +131 -88
- package/dist/ai-cli.js.map +1 -1
- package/dist/author-journey-cli.d.ts +4 -0
- package/dist/author-journey-cli.js +111 -0
- package/dist/author-journey-cli.js.map +1 -0
- package/dist/bin.js +60349 -16477
- package/dist/bin.js.map +1 -1
- package/dist/browser-run-options.d.ts +89 -0
- package/dist/browser-run-options.js +175 -0
- package/dist/browser-run-options.js.map +1 -0
- package/dist/build-info.generated.d.ts +2 -0
- package/dist/build-info.generated.js +10 -0
- package/dist/build-info.generated.js.map +1 -0
- package/dist/campaign-api.d.ts +151 -0
- package/dist/campaign-api.js +446 -0
- package/dist/campaign-api.js.map +1 -0
- package/dist/campaign-cli.d.ts +6 -0
- package/dist/campaign-cli.js +66 -0
- package/dist/campaign-cli.js.map +1 -0
- package/dist/check-api.d.ts +5 -0
- package/dist/check-api.js +234 -0
- package/dist/check-api.js.map +1 -0
- package/dist/check-budget.d.ts +26 -0
- package/dist/check-budget.js +90 -0
- package/dist/check-budget.js.map +1 -0
- package/dist/check-cli.d.ts +31 -0
- package/dist/check-cli.js +109 -0
- package/dist/check-cli.js.map +1 -0
- package/dist/check-execute.d.ts +29 -0
- package/dist/check-execute.js +420 -0
- package/dist/check-execute.js.map +1 -0
- package/dist/check-plan.d.ts +118 -0
- package/dist/check-plan.js +516 -0
- package/dist/check-plan.js.map +1 -0
- package/dist/check-suite.d.ts +184 -0
- package/dist/check-suite.js +540 -0
- package/dist/check-suite.js.map +1 -0
- package/dist/check-types.d.ts +181 -0
- package/dist/check-types.js +35 -0
- package/dist/check-types.js.map +1 -0
- package/dist/cli-args.d.ts +26 -0
- package/dist/cli-args.js +50 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-output.d.ts +106 -0
- package/dist/cli-output.js +563 -0
- package/dist/cli-output.js.map +1 -0
- package/dist/cli-reference.d.ts +3 -0
- package/dist/cli-reference.js +81 -0
- package/dist/cli-reference.js.map +1 -0
- package/dist/cli-refusal.d.ts +12 -0
- package/dist/cli-refusal.js +52 -0
- package/dist/cli-refusal.js.map +1 -0
- package/dist/cli-shared.d.ts +340 -0
- package/dist/cli-shared.js +537 -0
- package/dist/cli-shared.js.map +1 -0
- package/dist/cli-surface.d.ts +33 -0
- package/dist/cli-surface.js +48 -0
- package/dist/cli-surface.js.map +1 -0
- package/dist/conversation-options.d.ts +15 -0
- package/dist/conversation-options.js +10 -0
- package/dist/conversation-options.js.map +1 -0
- package/dist/credentials-file.d.ts +15 -0
- package/dist/credentials-file.js +56 -0
- package/dist/credentials-file.js.map +1 -0
- package/dist/data-dir.d.ts +1 -1
- package/dist/data-dir.js +1 -1
- package/dist/defect-evidence.d.ts +141 -0
- package/dist/defect-evidence.js +505 -0
- package/dist/defect-evidence.js.map +1 -0
- package/dist/demo-aspect-api.d.ts +209 -0
- package/dist/demo-aspect-api.js +398 -0
- package/dist/demo-aspect-api.js.map +1 -0
- package/dist/demo-aspect-cli.d.ts +3 -0
- package/dist/demo-aspect-cli.js +243 -0
- package/dist/demo-aspect-cli.js.map +1 -0
- package/dist/demo-capture.d.ts +142 -0
- package/dist/demo-capture.js +537 -0
- package/dist/demo-capture.js.map +1 -0
- package/dist/engine.d.ts +35 -0
- package/dist/engine.js +25 -0
- package/dist/engine.js.map +1 -0
- package/dist/environments.d.ts +155 -0
- package/dist/environments.js +364 -0
- package/dist/environments.js.map +1 -0
- package/dist/exit-codes.d.ts +46 -0
- package/dist/exit-codes.js +91 -0
- package/dist/exit-codes.js.map +1 -0
- package/dist/explore-adversarial.d.ts +144 -0
- package/dist/explore-adversarial.js +227 -0
- package/dist/explore-adversarial.js.map +1 -0
- package/dist/explore-api.d.ts +7 -187
- package/dist/explore-api.js +7 -301
- package/dist/explore-api.js.map +1 -1
- package/dist/explore-author.d.ts +79 -0
- package/dist/explore-author.js +86 -0
- package/dist/explore-author.js.map +1 -0
- package/dist/explore-cli.d.ts +7 -0
- package/dist/explore-cli.js +1199 -0
- package/dist/explore-cli.js.map +1 -0
- package/dist/explore-coverage.d.ts +173 -0
- package/dist/explore-coverage.js +246 -0
- package/dist/explore-coverage.js.map +1 -0
- package/dist/explore-feature.d.ts +125 -0
- package/dist/explore-feature.js +218 -0
- package/dist/explore-feature.js.map +1 -0
- package/dist/explore-goal.d.ts +271 -0
- package/dist/explore-goal.js +417 -0
- package/dist/explore-goal.js.map +1 -0
- package/dist/explore-shared.d.ts +177 -0
- package/dist/explore-shared.js +149 -0
- package/dist/explore-shared.js.map +1 -0
- package/dist/explore-specs.d.ts +53 -0
- package/dist/explore-specs.js +333 -0
- package/dist/explore-specs.js.map +1 -0
- package/dist/findings-filing.d.ts +64 -0
- package/dist/findings-filing.js +108 -0
- package/dist/findings-filing.js.map +1 -0
- package/dist/fixture-auth.d.ts +63 -0
- package/dist/fixture-auth.js +95 -0
- package/dist/fixture-auth.js.map +1 -0
- package/dist/fixture-cli.d.ts +99 -0
- package/dist/fixture-cli.js +292 -0
- package/dist/fixture-cli.js.map +1 -0
- package/dist/github-issue-filer.d.ts +62 -0
- package/dist/github-issue-filer.js +189 -0
- package/dist/github-issue-filer.js.map +1 -0
- package/dist/host-health-run.d.ts +25 -0
- package/dist/host-health-run.js +33 -0
- package/dist/host-health-run.js.map +1 -0
- package/dist/http-5xx-outcome.d.ts +6 -0
- package/dist/http-5xx-outcome.js +39 -0
- package/dist/http-5xx-outcome.js.map +1 -0
- package/dist/inbox-cli.d.ts +7 -0
- package/dist/inbox-cli.js +197 -0
- package/dist/inbox-cli.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init-cli.d.ts +4 -0
- package/dist/init-cli.js +156 -0
- package/dist/init-cli.js.map +1 -0
- package/dist/init-keys.d.ts +30 -2
- package/dist/init-keys.js +19 -5
- package/dist/init-keys.js.map +1 -1
- package/dist/init-next-steps.d.ts +35 -0
- package/dist/init-next-steps.js +79 -0
- package/dist/init-next-steps.js.map +1 -0
- package/dist/invariants-file.d.ts +34 -0
- package/dist/invariants-file.js +68 -0
- package/dist/invariants-file.js.map +1 -0
- package/dist/invariants-validate.d.ts +30 -0
- package/dist/invariants-validate.js +105 -0
- package/dist/invariants-validate.js.map +1 -0
- package/dist/journey-annotate-api.d.ts +76 -0
- package/dist/journey-annotate-api.js +269 -0
- package/dist/journey-annotate-api.js.map +1 -0
- package/dist/journey-annotate-cli.d.ts +9 -0
- package/dist/journey-annotate-cli.js +181 -0
- package/dist/journey-annotate-cli.js.map +1 -0
- package/dist/journey-api.d.ts +104 -2
- package/dist/journey-api.js +163 -20
- package/dist/journey-api.js.map +1 -1
- package/dist/journey-cli.d.ts +4 -0
- package/dist/journey-cli.js +411 -0
- package/dist/journey-cli.js.map +1 -0
- package/dist/journey-demo-api.d.ts +114 -0
- package/dist/journey-demo-api.js +405 -0
- package/dist/journey-demo-api.js.map +1 -0
- package/dist/journey-demo-cli.d.ts +10 -0
- package/dist/journey-demo-cli.js +158 -0
- package/dist/journey-demo-cli.js.map +1 -0
- package/dist/journey-prefix.d.ts +194 -0
- package/dist/journey-prefix.js +279 -0
- package/dist/journey-prefix.js.map +1 -0
- package/dist/key-report.d.ts +49 -0
- package/dist/key-report.js +101 -0
- package/dist/key-report.js.map +1 -0
- package/dist/kill-signal.d.ts +193 -0
- package/dist/kill-signal.js +283 -0
- package/dist/kill-signal.js.map +1 -0
- package/dist/launch-armed.d.ts +37 -0
- package/dist/launch-armed.js +31 -0
- package/dist/launch-armed.js.map +1 -0
- package/dist/ledger-api.d.ts +106 -0
- package/dist/ledger-api.js +239 -0
- package/dist/ledger-api.js.map +1 -0
- package/dist/ledger-cli.d.ts +18 -0
- package/dist/ledger-cli.js +107 -0
- package/dist/ledger-cli.js.map +1 -0
- package/dist/load-api.d.ts +29 -11
- package/dist/load-api.js +23 -15
- package/dist/load-api.js.map +1 -1
- package/dist/load-cli.d.ts +4 -0
- package/dist/load-cli.js +97 -0
- package/dist/load-cli.js.map +1 -0
- package/dist/log-correlation.d.ts +200 -0
- package/dist/log-correlation.js +394 -0
- package/dist/log-correlation.js.map +1 -0
- package/dist/log-lines.d.ts +131 -0
- package/dist/log-lines.js +389 -0
- package/dist/log-lines.js.map +1 -0
- package/dist/log-sources.d.ts +71 -0
- package/dist/log-sources.js +236 -0
- package/dist/log-sources.js.map +1 -0
- package/dist/log-trace.d.ts +80 -0
- package/dist/log-trace.js +210 -0
- package/dist/log-trace.js.map +1 -0
- package/dist/logs-cli.d.ts +3 -0
- package/dist/logs-cli.js +51 -0
- package/dist/logs-cli.js.map +1 -0
- package/dist/logs-retention.d.ts +28 -0
- package/dist/logs-retention.js +85 -0
- package/dist/logs-retention.js.map +1 -0
- package/dist/masked-input.d.ts +22 -0
- package/dist/masked-input.js +99 -0
- package/dist/masked-input.js.map +1 -0
- package/dist/mcp-api.d.ts +91 -1
- package/dist/mcp-api.js +514 -18
- package/dist/mcp-api.js.map +1 -1
- package/dist/mcp-args.d.ts +50 -0
- package/dist/mcp-args.js +164 -0
- package/dist/mcp-args.js.map +1 -0
- package/dist/mcp-cli-bridge.d.ts +34 -0
- package/dist/mcp-cli-bridge.js +62 -0
- package/dist/mcp-cli-bridge.js.map +1 -0
- package/dist/mcp-cli-runner.d.ts +29 -0
- package/dist/mcp-cli-runner.js +44 -0
- package/dist/mcp-cli-runner.js.map +1 -0
- package/dist/mcp-cli-tools.d.ts +129 -0
- package/dist/mcp-cli-tools.js +737 -0
- package/dist/mcp-cli-tools.js.map +1 -0
- package/dist/mcp-paths.d.ts +28 -0
- package/dist/mcp-paths.js +76 -0
- package/dist/mcp-paths.js.map +1 -0
- package/dist/mission-actors.d.ts +40 -0
- package/dist/mission-actors.js +72 -0
- package/dist/mission-actors.js.map +1 -0
- package/dist/mission-api.d.ts +35 -0
- package/dist/mission-api.js +60 -3
- package/dist/mission-api.js.map +1 -1
- package/dist/mission-cli.d.ts +4 -0
- package/dist/mission-cli.js +248 -0
- package/dist/mission-cli.js.map +1 -0
- package/dist/mission-exit.d.ts +22 -0
- package/dist/mission-exit.js +26 -0
- package/dist/mission-exit.js.map +1 -0
- package/dist/mission-fixtures.d.ts +234 -0
- package/dist/mission-fixtures.js +862 -0
- package/dist/mission-fixtures.js.map +1 -0
- package/dist/mission-journal.d.ts +60 -0
- package/dist/mission-journal.js +115 -0
- package/dist/mission-journal.js.map +1 -0
- package/dist/mission-queue-cli.d.ts +10 -0
- package/dist/mission-queue-cli.js +198 -0
- package/dist/mission-queue-cli.js.map +1 -0
- package/dist/mission-queue-runner.d.ts +126 -0
- package/dist/mission-queue-runner.js +406 -0
- package/dist/mission-queue-runner.js.map +1 -0
- package/dist/multi-run-cli.d.ts +37 -0
- package/dist/multi-run-cli.js +116 -0
- package/dist/multi-run-cli.js.map +1 -0
- package/dist/multi-run.d.ts +339 -0
- package/dist/multi-run.js +619 -0
- package/dist/multi-run.js.map +1 -0
- package/dist/openrouter-call.d.ts +22 -0
- package/dist/openrouter-call.js +64 -0
- package/dist/openrouter-call.js.map +1 -0
- package/dist/profile-cli.d.ts +4 -0
- package/dist/profile-cli.js +57 -0
- package/dist/profile-cli.js.map +1 -0
- package/dist/program.d.ts +3 -75
- package/dist/program.js +123 -1921
- package/dist/program.js.map +1 -1
- package/dist/project-dir.d.ts +96 -0
- package/dist/project-dir.js +221 -0
- package/dist/project-dir.js.map +1 -0
- package/dist/record-api.d.ts +13 -7
- package/dist/record-api.js +44 -30
- package/dist/record-api.js.map +1 -1
- package/dist/record-cli.d.ts +4 -0
- package/dist/record-cli.js +76 -0
- package/dist/record-cli.js.map +1 -0
- package/dist/recording-cli.d.ts +4 -0
- package/dist/recording-cli.js +248 -0
- package/dist/recording-cli.js.map +1 -0
- package/dist/regression-api.d.ts +107 -0
- package/dist/regression-api.js +387 -6
- package/dist/regression-api.js.map +1 -1
- package/dist/regression-cli.d.ts +4 -0
- package/dist/regression-cli.js +284 -0
- package/dist/regression-cli.js.map +1 -0
- package/dist/report-api.d.ts +146 -0
- package/dist/report-api.js +431 -0
- package/dist/report-api.js.map +1 -0
- package/dist/report-cli.d.ts +12 -0
- package/dist/report-cli.js +147 -0
- package/dist/report-cli.js.map +1 -0
- package/dist/resource-preflight.d.ts +87 -0
- package/dist/resource-preflight.js +160 -0
- package/dist/resource-preflight.js.map +1 -0
- package/dist/result-schema.d.ts +22 -0
- package/dist/result-schema.js +28 -0
- package/dist/result-schema.js.map +1 -0
- package/dist/run-index.d.ts +29 -0
- package/dist/run-index.js +70 -0
- package/dist/run-index.js.map +1 -0
- package/dist/run-key-preflight.d.ts +42 -0
- package/dist/run-key-preflight.js +82 -0
- package/dist/run-key-preflight.js.map +1 -0
- package/dist/run-screenshots.d.ts +123 -0
- package/dist/run-screenshots.js +235 -0
- package/dist/run-screenshots.js.map +1 -0
- package/dist/runtime-env.d.ts +8 -0
- package/dist/runtime-env.js +23 -0
- package/dist/runtime-env.js.map +1 -0
- package/dist/secret-args.d.ts +23 -0
- package/dist/secret-args.js +45 -0
- package/dist/secret-args.js.map +1 -0
- package/dist/serve-cli.d.ts +4 -0
- package/dist/serve-cli.js +95 -0
- package/dist/serve-cli.js.map +1 -0
- package/dist/server-log-verify.d.ts +36 -0
- package/dist/server-log-verify.js +120 -0
- package/dist/server-log-verify.js.map +1 -0
- package/dist/session-check.d.ts +14 -0
- package/dist/session-check.js +44 -0
- package/dist/session-check.js.map +1 -0
- package/dist/site-cli.d.ts +4 -0
- package/dist/site-cli.js +127 -0
- package/dist/site-cli.js.map +1 -0
- package/dist/site-gate-cli.d.ts +28 -0
- package/dist/site-gate-cli.js +59 -0
- package/dist/site-gate-cli.js.map +1 -0
- package/dist/source-api.js +20 -4
- package/dist/source-api.js.map +1 -1
- package/dist/source-cli.d.ts +4 -0
- package/dist/source-cli.js +284 -0
- package/dist/source-cli.js.map +1 -0
- package/dist/source-run-api.d.ts +27 -1
- package/dist/source-run-api.js +22 -11
- package/dist/source-run-api.js.map +1 -1
- package/dist/storage-state-snapshot.d.ts +50 -0
- package/dist/storage-state-snapshot.js +87 -0
- package/dist/storage-state-snapshot.js.map +1 -0
- package/dist/suite-explore-options.d.ts +321 -0
- package/dist/suite-explore-options.js +162 -0
- package/dist/suite-explore-options.js.map +1 -0
- package/dist/target-config.d.ts +115 -0
- package/dist/target-config.js +225 -0
- package/dist/target-config.js.map +1 -0
- package/dist/transcript-file.d.ts +12 -0
- package/dist/transcript-file.js +23 -0
- package/dist/transcript-file.js.map +1 -0
- package/dist/type-fixture-file.d.ts +9 -0
- package/dist/type-fixture-file.js +48 -0
- package/dist/type-fixture-file.js.map +1 -0
- package/dist/ui-api.d.ts +3 -0
- package/dist/ui-api.js +11 -4
- package/dist/ui-api.js.map +1 -1
- package/dist/usability-capture.d.ts +43 -0
- package/dist/usability-capture.js +327 -0
- package/dist/usability-capture.js.map +1 -0
- package/dist/usage-config.d.ts +36 -0
- package/dist/usage-config.js +114 -0
- package/dist/usage-config.js.map +1 -0
- package/dist/ux-api.d.ts +3 -75
- package/dist/ux-api.js +3 -220
- package/dist/ux-api.js.map +1 -1
- package/dist/ux-claim-probe.d.ts +45 -0
- package/dist/ux-claim-probe.js +386 -0
- package/dist/ux-claim-probe.js.map +1 -0
- package/dist/ux-cli.d.ts +4 -0
- package/dist/ux-cli.js +109 -0
- package/dist/ux-cli.js.map +1 -0
- package/dist/ux-config.d.ts +29 -0
- package/dist/ux-config.js +103 -0
- package/dist/ux-config.js.map +1 -0
- package/dist/ux-evidence.d.ts +54 -0
- package/dist/ux-evidence.js +197 -0
- package/dist/ux-evidence.js.map +1 -0
- package/dist/ux-product.d.ts +14 -0
- package/dist/ux-product.js +39 -0
- package/dist/ux-product.js.map +1 -0
- package/dist/ux-review.d.ts +116 -0
- package/dist/ux-review.js +171 -0
- package/dist/ux-review.js.map +1 -0
- package/dist/ux-usability.d.ts +263 -0
- package/dist/ux-usability.js +580 -0
- package/dist/ux-usability.js.map +1 -0
- package/dist/verify-fix-api.d.ts +194 -0
- package/dist/verify-fix-api.js +506 -0
- package/dist/verify-fix-api.js.map +1 -0
- package/dist/verify-fix-cli.d.ts +4 -0
- package/dist/verify-fix-cli.js +115 -0
- package/dist/verify-fix-cli.js.map +1 -0
- package/package.json +23 -18
- package/skills/jevitate-ci-check/SKILL.md +77 -0
- package/skills/jevitate-demo/SKILL.md +61 -0
- package/skills/jevitate-explore/SKILL.md +96 -87
- package/skills/jevitate-getting-started/SKILL.md +89 -0
- package/skills/jevitate-load-test/SKILL.md +11 -2
- package/skills/jevitate-mission-scope/SKILL.md +19 -11
- package/skills/jevitate-record/SKILL.md +23 -5
- package/skills/jevitate-run-journey/SKILL.md +61 -17
- package/skills/jevitate-sources/SKILL.md +57 -14
- package/skills/jevitate-test-campaign/SKILL.md +203 -0
- package/skills/jevitate-ux-review/SKILL.md +106 -16
- package/skills/jevitate-verify-fix/SKILL.md +76 -0
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
// ux-usability.ts — the live usability mission runner (`explore --strategy usability`) (#231).
|
|
2
|
+
import { logsDirFor } from "./project-dir.js";
|
|
3
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
|
+
import { join, resolve as resolvePath } from "node:path";
|
|
5
|
+
import { PlaywrightBrowserPort } from "@jevitate/playwright";
|
|
6
|
+
import { closeOnce, demoOverlayOf, finalizeVideos, runVideoDir, sessionLaunchOptions } from "./browser-run-options.js";
|
|
7
|
+
import { runCaptureFor } from "./run-screenshots.js";
|
|
8
|
+
import { evidenceOf, withRunEvidence } from "./defect-evidence.js";
|
|
9
|
+
import { CastActor, BrowseTheWeb } from "@jevitate/screenplay";
|
|
10
|
+
import { explore, runGoalBasedMission, assertAuthorizedExploreTarget, resolveMissionFixture, reproduceHang, hangFinding, hangOutcome, InvariantMonitor, BudgetMonitor, secretFieldSecrets, clippingSummary, detectClipping, detectOverflow, shouldCheckOverflow } from "@jevitate/explore";
|
|
11
|
+
import { a11yChecks, analyzeClaims, buildReport, calibrationCaveat, claimsCaveat, detectFriction, detectSignals, groundFindings, loadV1Rubric, persistableScreen, resolveMinConfidence, resolveMaxFindingsPerRoute, resolveQualityPolicy, withSignalFindings, makeSignalFinding } from "@jevitate/ux";
|
|
12
|
+
import { captureFindingShots, planGuardProbes, runGuardProbes, skippedProbes, withProbePage } from "./ux-claim-probe.js";
|
|
13
|
+
import { NO_PRODUCT_FACTS_CAVEAT, loadProductFacts } from "./ux-product.js";
|
|
14
|
+
import { conversationConfig } from "./conversation-options.js";
|
|
15
|
+
import { loadUxMaxFindingsPerPage, loadUxMinConfidence, loadUxMinConfidenceByAppClass, loadUxShow } from "./ux-config.js";
|
|
16
|
+
import { foldGoalOutcome, clock } from "@jevitate/domain";
|
|
17
|
+
import { MissionJournal, artifactStamp, closeQuietly, resultPathFor, writeMissionResult } from "./mission-journal.js";
|
|
18
|
+
import { MISSION_RESULT_SCHEMA_VERSION, advisoryDefects } from "./result-schema.js";
|
|
19
|
+
import { missionExitCode } from "./mission-exit.js";
|
|
20
|
+
import { launchArmed } from "./launch-armed.js";
|
|
21
|
+
import { branchFields, startFromJourney } from "./journey-prefix.js";
|
|
22
|
+
import { finishHostHealth } from "./host-health-run.js";
|
|
23
|
+
import { Http5xxOracle } from "@jevitate/explore";
|
|
24
|
+
import { currentEngineInfo } from "./engine.js";
|
|
25
|
+
import { openServerLogRuntime } from "./log-correlation.js";
|
|
26
|
+
import { serverLogRuntimeOptions } from "./explore-shared.js";
|
|
27
|
+
import { assertSaveStorageStateOutsideProject, currentUrlSafe, persistStorageState, serverLogResult } from "./explore-api.js";
|
|
28
|
+
import { transcriptPathFor } from "./transcript-file.js";
|
|
29
|
+
import { UsabilityCapture } from "./usability-capture.js";
|
|
30
|
+
import { DEFAULT_JUDGMENT_BUDGET, extractTypedValues, snapshotToEvidence } from "./ux-evidence.js";
|
|
31
|
+
import { UxAnalysisFailedError } from "./ux-review.js";
|
|
32
|
+
/** Usability reads only a spec's `budget` (#150) — never its `invariants`/`capture` (#86/#147, not supported here). */
|
|
33
|
+
export class UsabilityInvariantsUnsupportedError extends Error {
|
|
34
|
+
code = "E_USABILITY_INVARIANTS";
|
|
35
|
+
constructor() {
|
|
36
|
+
super("usability does not check app-declared invariants or captures — only a `budget` is read; " +
|
|
37
|
+
"give a spec with an empty invariants array (and no capture) to use --invariants with usability");
|
|
38
|
+
this.name = "UsabilityInvariantsUnsupportedError";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Opens a FRESH browser session for replays (hang reproduction): a new context from the same port
|
|
43
|
+
* and options — same authenticated storageState, never the session the finding was made in.
|
|
44
|
+
*/
|
|
45
|
+
function freshSessionOpener(portFactory, launch, allowlist) {
|
|
46
|
+
return async () => {
|
|
47
|
+
const session = await portFactory().open(launch);
|
|
48
|
+
const actor = CastActor.named("replay").whoCan(new BrowseTheWeb(session, [...allowlist]));
|
|
49
|
+
return { page: session.page, actor, close: () => session.close() };
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Live usability mission. Guardrail #1 authorizes BEFORE opening a browser.
|
|
54
|
+
* Reuses explore()'s loop (goal = the job) and, via the additive onSnapshot
|
|
55
|
+
* hook, collects one screen's evidence per observation — then analyzes ONCE
|
|
56
|
+
* after the run. A UX finding NEVER gates the loop (the hook's result is
|
|
57
|
+
* ignored by explore). The temp profile dir is always removed.
|
|
58
|
+
*/
|
|
59
|
+
export async function runUsabilityMission(opts) {
|
|
60
|
+
const origin = assertAuthorizedExploreTarget(opts.url, opts.allowlist);
|
|
61
|
+
assertSaveStorageStateOutsideProject(opts.saveStorageState);
|
|
62
|
+
// #150 — usability reads only a spec's `budget`: it does not check invariants or captures (#86/
|
|
63
|
+
// #147) today. Refused BEFORE a browser opens, same as every other bad-input refusal here.
|
|
64
|
+
if (opts.invariants !== undefined && (opts.invariants.invariants.length > 0 || opts.invariants.capture !== undefined)) {
|
|
65
|
+
throw new UsabilityInvariantsUnsupportedError();
|
|
66
|
+
}
|
|
67
|
+
// Validate the cutoff before a browser opens — a bad value fails fast, never mid-run.
|
|
68
|
+
const minConfidence = resolveMinConfidence(opts.minConfidence, opts.env ?? process.env, loadUxMinConfidence(opts.configPath), loadUxMinConfidenceByAppClass(opts.configPath, opts.appContext.appClass));
|
|
69
|
+
const quality = resolveQualityPolicy(opts.show, opts.env ?? process.env, loadUxShow(opts.configPath), opts.appContext.appClass);
|
|
70
|
+
const maxFindingsPerRoute = resolveMaxFindingsPerRoute(opts.maxFindingsPerRoute, opts.env ?? process.env, loadUxMaxFindingsPerPage(opts.configPath));
|
|
71
|
+
const fixture = opts.fixture === undefined ? undefined : await resolveMissionFixture(opts.fixture);
|
|
72
|
+
// #198: the product facts are validated before a browser opens (a bad file is a usage error).
|
|
73
|
+
const product = await loadProductFacts(opts.product);
|
|
74
|
+
// #250/#251: a recorded or screenshotted run's sessions carry the live pixel mask from their first
|
|
75
|
+
// paint; `--screenshots` captures after each step (the Recording path names their folder).
|
|
76
|
+
const runCapture = runCaptureFor({
|
|
77
|
+
recordsVideo: opts.browser?.recordVideo !== undefined,
|
|
78
|
+
screenshots: opts.screenshots,
|
|
79
|
+
secrets: [...(opts.secrets ?? []), ...secretFieldSecrets(opts.secretFields)],
|
|
80
|
+
artifactPath: () => journal.recordingPath,
|
|
81
|
+
title: `usability: ${opts.job}`,
|
|
82
|
+
});
|
|
83
|
+
const portFactory = runCapture.wrap(opts.browserPortFactory ?? (() => new PlaywrightBrowserPort()));
|
|
84
|
+
const port = portFactory();
|
|
85
|
+
const collected = [];
|
|
86
|
+
const history = [];
|
|
87
|
+
// #149: one signal finding per distinct fingerprint (route + element) — a wide table seen across
|
|
88
|
+
// many observed screens is still ONE finding, never a finding per occurrence.
|
|
89
|
+
const overflowFindings = [];
|
|
90
|
+
const seenOverflow = new Set();
|
|
91
|
+
const extract = opts.extractText ??
|
|
92
|
+
(async (s) => s.page.evaluate(() => (typeof document !== "undefined" && document.body ? document.body.innerText : "")));
|
|
93
|
+
const outDir = opts.outDir ?? logsDirFor();
|
|
94
|
+
const iso = (opts.nowIso ?? (() => clock.nowIso()))();
|
|
95
|
+
const stamp = artifactStamp(iso);
|
|
96
|
+
const reportPath = join(outDir, `usability-${stamp}.json`);
|
|
97
|
+
// #98 — the same artifact shape as goal/adversarial missions, next to the report: the decision
|
|
98
|
+
// transcript (each step's redacted typed value and screenshot), the Recording and the per-step
|
|
99
|
+
// screenshots. Crash-safe: the transcript and partial Recording are flushed after every step.
|
|
100
|
+
const journal = new MissionJournal(join(outDir, `usability-${stamp}.recording.json`), transcriptPathFor(reportPath));
|
|
101
|
+
const screenshotDir = join(outDir, `usability-${stamp}.screens`);
|
|
102
|
+
// #245: shown/recorded like every other strategy's session (videos in `usability-<stamp>.videos/`).
|
|
103
|
+
const videoDir = runVideoDir(opts.browser, reportPath);
|
|
104
|
+
const launch = {
|
|
105
|
+
...sessionLaunchOptions(opts.browser, videoDir),
|
|
106
|
+
allowedOrigins: [...opts.allowlist],
|
|
107
|
+
baseUrl: origin,
|
|
108
|
+
...opts.emulation,
|
|
109
|
+
...(opts.storageState !== undefined ? { storageState: opts.storageState } : {}),
|
|
110
|
+
};
|
|
111
|
+
// A bound secret (or TOTP seed) is a run secret too: masked on screen, redacted everywhere.
|
|
112
|
+
const secrets = [...(opts.secrets ?? []), ...secretFieldSecrets(opts.secretFields)];
|
|
113
|
+
// #163: this run's own share of a (possibly shared) tracker: its usage and sidecar.
|
|
114
|
+
const runUsage = opts.usage?.scope();
|
|
115
|
+
// The screenshot capture needs the open page; until then a killed run has taken none.
|
|
116
|
+
let armedCapture;
|
|
117
|
+
// Crash-safe on SIGTERM/SIGINT too (#94): a partial `inconclusive` result is written from
|
|
118
|
+
// whatever the journal has already flushed, and the process exits with the conventional code.
|
|
119
|
+
// #120: the transcript lives next to the REPORT (`usability-<stamp>.transcript.json`), not the
|
|
120
|
+
// Recording — so the killed run's result names the real file, and reports the live step list,
|
|
121
|
+
// the tokens spent so far and the screens already observed.
|
|
122
|
+
// #226: the kill switch is armed BEFORE the host sampler and the browser launch (see launch-armed.ts).
|
|
123
|
+
const { disarmKillSwitch, health, session, snapshotter } = await launchArmed({
|
|
124
|
+
hostHealth: opts.hostHealth,
|
|
125
|
+
saveStorageState: opts.saveStorageState !== undefined,
|
|
126
|
+
open: () => port.open(launch),
|
|
127
|
+
mission: (hooks) => ({
|
|
128
|
+
// #220: the killed run's partial result carries the unified schema's common fields too.
|
|
129
|
+
strategy: "usability",
|
|
130
|
+
target: { seedUrl: opts.url, allowlist: [...opts.allowlist], ...(opts.storageState !== undefined ? { storageStatePath: resolvePath(opts.storageState) } : {}) },
|
|
131
|
+
recordingPath: journal.recordingPath,
|
|
132
|
+
hostHealth: hooks.hostHealth,
|
|
133
|
+
...(videoDir === undefined ? {} : { videoDir }),
|
|
134
|
+
transcriptPath: journal.transcriptPath,
|
|
135
|
+
transcript: () => journal.transcript,
|
|
136
|
+
...(runUsage === undefined ? {} : { usage: runUsage }),
|
|
137
|
+
partialReport: () => ({ screensObserved: collected.length, screenshotDir, screenshots: armedCapture === undefined ? [] : armedCapture.screenshots() }),
|
|
138
|
+
...(opts.saveStorageState === undefined ? {} : { storageState: { path: opts.saveStorageState, snapshot: hooks.snapshot } }),
|
|
139
|
+
}),
|
|
140
|
+
});
|
|
141
|
+
// #208: the shared HTTP 5xx hard signal, listening from before the first navigation.
|
|
142
|
+
const http5xx = new Http5xxOracle(session.page, { allowlist: opts.allowlist });
|
|
143
|
+
const capture = new UsabilityCapture({
|
|
144
|
+
page: session.page,
|
|
145
|
+
screenshotDir,
|
|
146
|
+
secrets,
|
|
147
|
+
...(opts.secretFields === undefined ? {} : { secretFields: opts.secretFields }),
|
|
148
|
+
});
|
|
149
|
+
armedCapture = capture;
|
|
150
|
+
// The usability capture (screenshots) and the journal (crash-safe flush) are the EXISTING listener
|
|
151
|
+
// chain; a server-log runtime (#142) is inserted in FRONT of it (never replacing it) so every step
|
|
152
|
+
// still gets its screenshot/flush exactly as before, whether or not --log-source was given. #159:
|
|
153
|
+
// every settled step also refreshes the in-memory storageState snapshot (a cheap no-op when
|
|
154
|
+
// `--save-storage-state` was not given).
|
|
155
|
+
const journalListener = (entry, all) => {
|
|
156
|
+
runCapture.noteEntry(session.page, entry);
|
|
157
|
+
health.noteStep(entry);
|
|
158
|
+
http5xx.noteStep(entry);
|
|
159
|
+
capture.noteEntry(entry, all);
|
|
160
|
+
journal.onTranscriptEntry(entry, capture.withScreenshots(all));
|
|
161
|
+
snapshotter.noteSettledStep(currentUrlSafe(session));
|
|
162
|
+
};
|
|
163
|
+
const serverLog = openServerLogRuntime({
|
|
164
|
+
...serverLogRuntimeOptions(opts.serverLog),
|
|
165
|
+
secrets,
|
|
166
|
+
onTranscriptEntry: journalListener,
|
|
167
|
+
});
|
|
168
|
+
// #204: every request's correlation ids, from before the first navigation.
|
|
169
|
+
serverLog?.observe(session.page);
|
|
170
|
+
// #159/#245: persisted and closed once — early (before the result is written) when recording video.
|
|
171
|
+
const closeSession = closeOnce(async () => {
|
|
172
|
+
await persistStorageState(session, opts.saveStorageState, snapshotter);
|
|
173
|
+
await closeQuietly(session);
|
|
174
|
+
});
|
|
175
|
+
try {
|
|
176
|
+
// #293: a journey-anchored review first replays its Journey's prefix into this very session.
|
|
177
|
+
const start = await startFromJourney(opts.journeyPrefix, session, opts.url, opts.allowlist, opts.browser);
|
|
178
|
+
const actor = CastActor.named("usability-mission").whoCan(new BrowseTheWeb(session, [...opts.allowlist]));
|
|
179
|
+
// #150 — usability's own budget wiring: a plain `InvariantMonitor` reads a budget's declared
|
|
180
|
+
// observables (the same #86/#135 read/auth/redaction machinery), but this mission folds NO
|
|
181
|
+
// invariant defects — only a budget crossing can end the run early, via the same pre-action
|
|
182
|
+
// guard / post-settle hooks `explore()` offers every mission.
|
|
183
|
+
const budgetDecls = opts.invariants?.budget ?? [];
|
|
184
|
+
const invariantMonitor = opts.invariants === undefined || budgetDecls.length === 0
|
|
185
|
+
? null
|
|
186
|
+
: new InvariantMonitor(opts.invariants, {
|
|
187
|
+
allowlist: opts.allowlist,
|
|
188
|
+
baseUrl: opts.url,
|
|
189
|
+
...(opts.secrets === undefined ? {} : { secrets: opts.secrets }),
|
|
190
|
+
...(opts.invariantAuthTokens === undefined ? {} : { authTokens: opts.invariantAuthTokens }),
|
|
191
|
+
});
|
|
192
|
+
const budget = invariantMonitor === null ? null : new BudgetMonitor(budgetDecls, invariantMonitor);
|
|
193
|
+
let budgetSettledSteps = 0;
|
|
194
|
+
const exploreCfg = {
|
|
195
|
+
...(opts.target?.timing === undefined ? {} : { timingConfig: opts.target.timing }),
|
|
196
|
+
...(opts.target?.settle === undefined ? {} : { settle: opts.target.settle }),
|
|
197
|
+
...(opts.target?.hangs === undefined ? {} : { hangs: opts.target.hangs }),
|
|
198
|
+
...(opts.target?.safety === undefined ? {} : { safety: opts.target.safety }),
|
|
199
|
+
onTranscriptEntry: serverLog?.onTranscriptEntry ?? journalListener,
|
|
200
|
+
onRecording: journal.onRecording,
|
|
201
|
+
// #303 (opt-in): action deltas, with Jev's advisory relevance labels.
|
|
202
|
+
...(opts.actionDeltas === true ? { actionDeltas: { jev: true } } : {}),
|
|
203
|
+
hostHealth: health,
|
|
204
|
+
demoOverlay: demoOverlayOf(opts.browser),
|
|
205
|
+
...(opts.secretFields === undefined ? {} : { secretFields: opts.secretFields }),
|
|
206
|
+
actor,
|
|
207
|
+
judge: opts.judge,
|
|
208
|
+
gen: opts.gen,
|
|
209
|
+
goal: opts.job,
|
|
210
|
+
allowlist: opts.allowlist,
|
|
211
|
+
startUrl: start.url,
|
|
212
|
+
...(start.branch === undefined ? {} : { startInPlace: true }),
|
|
213
|
+
...(start.restart === undefined ? {} : { restartAtStart: start.restart.restartAtStart }),
|
|
214
|
+
bounds: opts.bounds,
|
|
215
|
+
secrets: opts.secrets,
|
|
216
|
+
site: origin,
|
|
217
|
+
fixture,
|
|
218
|
+
...conversationConfig(opts.conversation),
|
|
219
|
+
onSnapshot: async (snap) => {
|
|
220
|
+
let visibleText = "";
|
|
221
|
+
try {
|
|
222
|
+
visibleText = await extract(session);
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
visibleText = ""; // best-effort; the analyzer Skips visibleText items honestly
|
|
226
|
+
}
|
|
227
|
+
const ev = snapshotToEvidence(snap, visibleText, opts.appContext, opts.job, [...history]);
|
|
228
|
+
collected.push(ev);
|
|
229
|
+
history.push({ screenId: ev.screenId, url: ev.url });
|
|
230
|
+
// #98 the step's (secret-masked) screenshot; #96 the screen's facts for the signal oracles.
|
|
231
|
+
await capture.observe(snap, visibleText);
|
|
232
|
+
// #149: horizontal-overflow hard signal — pure DOM geometry, never a model judgment.
|
|
233
|
+
// Best-effort like visibleText extraction above: a detection failure never fails the mission.
|
|
234
|
+
try {
|
|
235
|
+
const vp = session.page.viewportSize();
|
|
236
|
+
if (shouldCheckOverflow(vp?.width, opts.overflow?.checkOverflow ?? false)) {
|
|
237
|
+
const overflow = await detectOverflow(session.page, {
|
|
238
|
+
viewport: vp ?? { width: 1280, height: 720 },
|
|
239
|
+
...(opts.emulation?.device === undefined ? {} : { device: opts.emulation.device }),
|
|
240
|
+
...(opts.overflow?.toleranceCss === undefined ? {} : { toleranceCss: opts.overflow.toleranceCss }),
|
|
241
|
+
...(opts.overflow?.ignoreSelectors === undefined ? {} : { ignoreSelectors: opts.overflow.ignoreSelectors }),
|
|
242
|
+
secrets,
|
|
243
|
+
});
|
|
244
|
+
if (overflow !== null && !seenOverflow.has(overflow.fingerprint)) {
|
|
245
|
+
seenOverflow.add(overflow.fingerprint);
|
|
246
|
+
overflowFindings.push(makeSignalFinding({
|
|
247
|
+
kind: "horizontal-overflow",
|
|
248
|
+
confidence: 0.9,
|
|
249
|
+
url: ev.url,
|
|
250
|
+
screenId: ev.screenId,
|
|
251
|
+
observation: `${overflow.element.descriptor} overflows the ${overflow.viewport.width}px viewport by ${overflow.overflowPx}px on ${overflow.route}.`,
|
|
252
|
+
userImpact: "Content extends past the visible viewport; a user on this device must discover and use horizontal scrolling to see it, and may miss it entirely.",
|
|
253
|
+
recommendation: `Constrain ${overflow.element.descriptor} to the viewport width (e.g. a responsive layout, or an explicit scroll container) at ${overflow.viewport.width}px.`,
|
|
254
|
+
controls: [overflow.element.descriptor],
|
|
255
|
+
evidence: {
|
|
256
|
+
kind: "horizontal-overflow",
|
|
257
|
+
steps: [history.length],
|
|
258
|
+
requests: [],
|
|
259
|
+
detail: `scrollWidth exceeds innerWidth by ${overflow.overflowPx}px at a ${overflow.viewport.width}x${overflow.viewport.height} viewport`,
|
|
260
|
+
},
|
|
261
|
+
}));
|
|
262
|
+
}
|
|
263
|
+
// #302: text cut off vertically (a fixed-height box, or above the page top) — one finding per element.
|
|
264
|
+
const clipped = await detectClipping(session.page, {
|
|
265
|
+
viewport: vp ?? { width: 1280, height: 720 },
|
|
266
|
+
...(opts.emulation?.device === undefined ? {} : { device: opts.emulation.device }),
|
|
267
|
+
...(opts.overflow?.ignoreSelectors === undefined ? {} : { ignoreSelectors: opts.overflow.ignoreSelectors }),
|
|
268
|
+
secrets,
|
|
269
|
+
});
|
|
270
|
+
for (const c of clipped) {
|
|
271
|
+
if (seenOverflow.has(c.fingerprint))
|
|
272
|
+
continue;
|
|
273
|
+
seenOverflow.add(c.fingerprint);
|
|
274
|
+
overflowFindings.push(makeSignalFinding({
|
|
275
|
+
kind: "vertical-clipping",
|
|
276
|
+
confidence: 0.9,
|
|
277
|
+
url: ev.url,
|
|
278
|
+
screenId: ev.screenId,
|
|
279
|
+
observation: c.cause === "overflow-hidden"
|
|
280
|
+
? `${c.element.descriptor} cuts off its text by ${c.clippedPx}px on ${c.route}: the content is taller than the box and overflow is hidden.`
|
|
281
|
+
: `${c.element.descriptor} is cut off ${c.clippedPx}px above the top of the page on ${c.route}.`,
|
|
282
|
+
userImpact: "Part of the text is cut off and no scroll position shows it: a user on this device cannot read it.",
|
|
283
|
+
recommendation: c.cause === "overflow-hidden"
|
|
284
|
+
? `Let ${c.element.descriptor} grow with its content (min-height instead of height), make it scrollable, or truncate on purpose with line-clamp at ${c.viewport.width}px.`
|
|
285
|
+
: `Give the container of ${c.element.descriptor} room for its wrapped content (no fixed height, or no wrapping) at ${c.viewport.width}px.`,
|
|
286
|
+
controls: [c.element.descriptor],
|
|
287
|
+
evidence: { kind: "vertical-clipping", steps: [history.length], requests: [], detail: clippingSummary(c) },
|
|
288
|
+
}));
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
// Best-effort: the run's own explore loop is never held up or failed by this check.
|
|
294
|
+
}
|
|
295
|
+
},
|
|
296
|
+
...(budget === null
|
|
297
|
+
? {}
|
|
298
|
+
: {
|
|
299
|
+
onBeforeAction: async (info) => {
|
|
300
|
+
const g = await budget.guard(session.page, info);
|
|
301
|
+
return g.refuse ? { refuse: true, reason: g.reason ?? "budget guard refused the action" } : { refuse: false };
|
|
302
|
+
},
|
|
303
|
+
onSettled: async () => {
|
|
304
|
+
budgetSettledSteps += 1;
|
|
305
|
+
// The FIRST settled snapshot (before any action) is the budget's baseline.
|
|
306
|
+
if (budgetSettledSteps === 1) {
|
|
307
|
+
const b = await budget.baseline(session.page);
|
|
308
|
+
return b.crossed ? { stop: true, reason: b.reason ?? "budget observable unreadable at run start" } : { stop: false };
|
|
309
|
+
}
|
|
310
|
+
const r = await budget.afterSettle(session.page, budgetSettledSteps);
|
|
311
|
+
return r.crossed ? { stop: true, reason: r.reason ?? "mission budget crossed" } : { stop: false };
|
|
312
|
+
},
|
|
313
|
+
}),
|
|
314
|
+
};
|
|
315
|
+
const brief = "usability review: pursue the stated job as a plausible first-time user, using only what is on screen";
|
|
316
|
+
// #225: `--success` is never ignored — with checks the loop runs through the goal mission's
|
|
317
|
+
// independent adjudication (the same oracle, `held`/vacuous rules and verdict as a goal run).
|
|
318
|
+
const checks = opts.successChecks ?? [];
|
|
319
|
+
const adjudication = checks.length === 0
|
|
320
|
+
? undefined
|
|
321
|
+
: await runGoalBasedMission({
|
|
322
|
+
...exploreCfg,
|
|
323
|
+
missionBrief: brief,
|
|
324
|
+
successChecks: checks,
|
|
325
|
+
// #225: a `done` whose check failed on a job judged done ends the run — never the whole budget.
|
|
326
|
+
stopWhenJudgedDone: true,
|
|
327
|
+
...(opts.successWhen === undefined ? {} : { successWhen: opts.successWhen }),
|
|
328
|
+
...(opts.allowVacuousChecks === true ? { allowVacuousChecks: true } : {}),
|
|
329
|
+
});
|
|
330
|
+
const run = adjudication?.run ?? (await explore({ ...exploreCfg, missionContext: brief }));
|
|
331
|
+
// Never blocks the mission itself: the drain wait happens AFTER `explore()` returned.
|
|
332
|
+
const serverLogRun = serverLog === undefined ? undefined : await serverLog.finish(run.transcript);
|
|
333
|
+
journal.writeRecording(run.recording);
|
|
334
|
+
journal.writeTranscript(capture.withScreenshots(serverLogRun?.transcript ?? run.transcript));
|
|
335
|
+
// #85 item 1: the live run's own typed values (from its emitted Recording's fill/select
|
|
336
|
+
// steps — never a secret), so the vocabulary/jargon tier can tell the app's own copy apart
|
|
337
|
+
// from user-authored content it merely echoed back (same mechanism as the offline pass).
|
|
338
|
+
const typedValues = extractTypedValues(run.recording);
|
|
339
|
+
const screens = typedValues.length > 0 ? collected.map((ev) => ({ ...ev, typedValues })) : collected;
|
|
340
|
+
// #96: findings from the run's own measurements (hung request, duplicate write, internal id,
|
|
341
|
+
// inert control) — independent code, no model — reported alongside the rubric's.
|
|
342
|
+
const signalCapture = await capture.signalCapture(run.transcript, typedValues);
|
|
343
|
+
// A gRPC-web/Connect read is never a duplicate write (#110); `--read-rpc` marks more reads.
|
|
344
|
+
const readRequests = opts.target?.safety?.readRequests;
|
|
345
|
+
const signalFindings = [
|
|
346
|
+
...detectSignals(signalCapture, readRequests === undefined ? opts.signals : { ...opts.signals, readRequests }),
|
|
347
|
+
// #149: horizontal-overflow, computed live during the run (never from the captured timeline).
|
|
348
|
+
...overflowFindings,
|
|
349
|
+
];
|
|
350
|
+
// #132: the friction the run walked into — what grounds (or not) each rubric finding.
|
|
351
|
+
const friction = detectFriction(signalCapture, run.outcome);
|
|
352
|
+
// #198: every destructive control on an analyzed screen is clicked once with its writes blocked
|
|
353
|
+
// (ux-claim-probe.ts) — the code evidence `destructive-unguarded` claims are verified against.
|
|
354
|
+
// On a dedicated page in the run's context, after the loop: the run's oracles never see it.
|
|
355
|
+
// A screen that cannot be redacted means no probes at all (destructive claims: unverifiable).
|
|
356
|
+
let probes;
|
|
357
|
+
try {
|
|
358
|
+
const plan = planGuardProbes(screens, secrets, opts.target?.safety);
|
|
359
|
+
probes = [...plan.refused];
|
|
360
|
+
// Clicking is opt-in (--probe-guards): without it every destructive control is `skipped`, and
|
|
361
|
+
// its guard claim is reported unverifiable — never asserted, never silently dropped.
|
|
362
|
+
if (opts.probeGuards !== true)
|
|
363
|
+
probes.push(...skippedProbes(plan.targets));
|
|
364
|
+
else if (plan.targets.length > 0) {
|
|
365
|
+
try {
|
|
366
|
+
probes.push(...(await runGuardProbes(session.page, plan.targets, { allowlist: opts.allowlist, secrets })));
|
|
367
|
+
}
|
|
368
|
+
catch (err) {
|
|
369
|
+
const why = `the guard probe could not open a page: ${err instanceof Error ? err.message.split("\n")[0] : String(err)}`;
|
|
370
|
+
probes.push(...plan.targets.map((t) => ({ screenId: t.screen.screenId, route: t.route, control: t.label, controlKey: t.key, status: "failed", detail: why })));
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
catch {
|
|
375
|
+
probes = undefined;
|
|
376
|
+
}
|
|
377
|
+
// #134: the evidence sidecar, written through the redaction door BEFORE analysis (so it exists
|
|
378
|
+
// even when analysis fails). Fail-closed: if any screen cannot be redacted, no file is written.
|
|
379
|
+
const evidencePath = join(outDir, `usability-${stamp}.evidence.json`);
|
|
380
|
+
let evidenceWritten = null;
|
|
381
|
+
try {
|
|
382
|
+
const file = {
|
|
383
|
+
version: 1,
|
|
384
|
+
appContext: opts.appContext,
|
|
385
|
+
job: opts.job,
|
|
386
|
+
screens: screens.map((ev) => persistableScreen(ev, secrets)),
|
|
387
|
+
signals: signalCapture,
|
|
388
|
+
outcome: run.outcome,
|
|
389
|
+
...(probes === undefined ? {} : { probes }),
|
|
390
|
+
};
|
|
391
|
+
await mkdir(outDir, { recursive: true });
|
|
392
|
+
await writeFile(evidencePath, `${JSON.stringify(file, null, 2)}\n`, "utf8");
|
|
393
|
+
evidenceWritten = evidencePath;
|
|
394
|
+
}
|
|
395
|
+
catch {
|
|
396
|
+
evidenceWritten = null;
|
|
397
|
+
}
|
|
398
|
+
// #198: findings are claims verified by code (claims.ts) — guard probes, product facts and the
|
|
399
|
+
// friction the run walked into — categorized and graded by Jev, written from templates.
|
|
400
|
+
const claimed = await analyzeClaims({
|
|
401
|
+
screens,
|
|
402
|
+
rubric: loadV1Rubric(),
|
|
403
|
+
appContext: opts.appContext,
|
|
404
|
+
secrets,
|
|
405
|
+
judgmentBudget: opts.judgmentBudget ?? DEFAULT_JUDGMENT_BUDGET,
|
|
406
|
+
friction,
|
|
407
|
+
steps: signalCapture.steps,
|
|
408
|
+
signalFindings,
|
|
409
|
+
...(probes === undefined ? {} : { probes }),
|
|
410
|
+
...(product.facts === undefined ? {} : { facts: product.facts }),
|
|
411
|
+
}, { judge: opts.judge, gen: opts.gen, a11yChecker: a11yChecks, ...(opts.polish === true ? { polish: true } : {}) });
|
|
412
|
+
// #198: a cropped, masked screenshot with the cited control boxed, per verified claim finding.
|
|
413
|
+
let outcome = claimed;
|
|
414
|
+
if (claimed.kind === "analyzed" && claimed.findings.some((f) => f.claim !== undefined)) {
|
|
415
|
+
const byScreen = new Map(screens.map((ev) => [ev.screenId, ev]));
|
|
416
|
+
const dir = join(outDir, `usability-${stamp}.findings`);
|
|
417
|
+
try {
|
|
418
|
+
const findings = await withProbePage(session.page, (p) => captureFindingShots(p, claimed.findings, byScreen, { dir, allowlist: opts.allowlist, secrets }));
|
|
419
|
+
outcome = { ...claimed, findings };
|
|
420
|
+
}
|
|
421
|
+
catch {
|
|
422
|
+
outcome = claimed; // presentation only: findings without screenshots are still the findings
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
// #126: a run that stops on a hang is never `clean` — it is reproduced in fresh contexts (same
|
|
426
|
+
// as a goal mission) and mapped through the same hang/intermittent/inconclusive rule.
|
|
427
|
+
let hang;
|
|
428
|
+
if (run.stop === "hang" && run.hang !== undefined) {
|
|
429
|
+
const h = run.hang;
|
|
430
|
+
const reproduction = await reproduceHang({
|
|
431
|
+
recording: run.recording,
|
|
432
|
+
recordingStepIndex: h.recordingStepIndex,
|
|
433
|
+
hang: h.signal,
|
|
434
|
+
openSession: freshSessionOpener(portFactory, launch, opts.allowlist),
|
|
435
|
+
...(opts.target?.safety === undefined ? {} : { safety: opts.target.safety }),
|
|
436
|
+
writtenBy: run.sideEffects.map((e) => e.control), // #181
|
|
437
|
+
perceive: {
|
|
438
|
+
...(opts.target?.settle === undefined ? {} : { settleConfig: opts.target.settle }),
|
|
439
|
+
...(opts.target?.hangs === undefined ? {} : { hangConfig: opts.target.hangs }),
|
|
440
|
+
},
|
|
441
|
+
});
|
|
442
|
+
hang = hangFinding(h.signal, run.transcript, h.recordingStepIndex, reproduction);
|
|
443
|
+
}
|
|
444
|
+
// #150 — a declared mission spend budget crossed (or a paid action was refused before crossing
|
|
445
|
+
// it): a clean, deliberate stop, never `crashed` — but never `clean` either (the run's own work
|
|
446
|
+
// past the stop is unproven), so it maps to `inconclusive` the same as `run.stop === "inconclusive"`.
|
|
447
|
+
const loopOutcome = run.stop === "crashed"
|
|
448
|
+
? "crashed"
|
|
449
|
+
: run.stop === "inconclusive" || run.stop === "budget"
|
|
450
|
+
? "inconclusive"
|
|
451
|
+
: run.stop === "hang"
|
|
452
|
+
? hangOutcome(hang?.reproduction.status ?? "inconclusive")
|
|
453
|
+
: "clean";
|
|
454
|
+
// #209: a review whose job was never completed (the loop gave up, ran out of budget, or its
|
|
455
|
+
// `done` was never verified) did not see what a user who finished it would: its silence about
|
|
456
|
+
// the rest proves nothing, so it is `inconclusive` (`job-incomplete`) — never `clean`, whatever
|
|
457
|
+
// the advisory UX findings say.
|
|
458
|
+
const jobIncomplete = loopOutcome === "clean" && run.outcome.status === "incomplete"
|
|
459
|
+
? { kind: "job-incomplete", message: `the job under review was not completed: ${run.outcome.reason}` }
|
|
460
|
+
: undefined;
|
|
461
|
+
// #225: with success checks, THEY decide whether the job was done — folded exactly like a goal
|
|
462
|
+
// run's ending (a failed check `defects-found`, a vacuous one `inconclusive`, all held `clean`).
|
|
463
|
+
const checked = adjudication === undefined ? undefined : foldGoalOutcome(adjudication.outcome);
|
|
464
|
+
const jobVerdict = loopOutcome !== "clean" ? loopOutcome : checked !== undefined ? checked : jobIncomplete === undefined ? "clean" : "inconclusive";
|
|
465
|
+
// #225/#209: a failed success check is named as such (never "job-incomplete"), as on a goal run.
|
|
466
|
+
const failedChecks = adjudication?.checks.filter((c) => !c.passed) ?? [];
|
|
467
|
+
const checkFailure = adjudication?.failure ??
|
|
468
|
+
(failedChecks.length === 0
|
|
469
|
+
? undefined
|
|
470
|
+
: { kind: "success-check-failed", message: `success check ${failedChecks.map((c) => `'${c.check}' ${c.detail}`).join("; ")}` });
|
|
471
|
+
const jobFailure = loopOutcome !== "clean" ? undefined : checked === undefined ? jobIncomplete : checked === "clean" ? undefined : (checkFailure ?? jobIncomplete);
|
|
472
|
+
// #203: most steps on a starved host → `inconclusive` (degraded-environment), never `clean`.
|
|
473
|
+
// #213: a job whose completion code verified (#225: its success checks held, or its done was
|
|
474
|
+
// adjudicated from save signals) is a positive proof — a starved host does not undo it. Only an
|
|
475
|
+
// unverified ending is downgraded, and it keeps its own reason (a failed check) in the degraded one.
|
|
476
|
+
// A model-only `grounded-judgment` is not code's proof, so it is still downgraded.
|
|
477
|
+
const jobVerified = jobVerdict === "clean" &&
|
|
478
|
+
(checked === "clean" || (checked === undefined && run.outcome.status === "completed" && run.outcome.verifiedBy !== "grounded-judgment"));
|
|
479
|
+
const host = await finishHostHealth(health, jobVerdict, {
|
|
480
|
+
verified: jobVerified,
|
|
481
|
+
...(jobFailure === undefined ? {} : { wouldHaveBeen: jobFailure.message }),
|
|
482
|
+
});
|
|
483
|
+
const runOutcome = host.outcome;
|
|
484
|
+
// #245: every context closed (videos finalized) before the result naming them is written.
|
|
485
|
+
const shotFields = await runCapture.finish();
|
|
486
|
+
const videos = await finalizeVideos(videoDir, closeSession);
|
|
487
|
+
const base = {
|
|
488
|
+
schemaVersion: MISSION_RESULT_SCHEMA_VERSION,
|
|
489
|
+
strategy: "usability",
|
|
490
|
+
target: {
|
|
491
|
+
seedUrl: start.url,
|
|
492
|
+
allowlist: [...opts.allowlist],
|
|
493
|
+
...(opts.storageState !== undefined ? { storageStatePath: resolvePath(opts.storageState) } : {}),
|
|
494
|
+
},
|
|
495
|
+
...branchFields(start),
|
|
496
|
+
recordingPaths: [journal.recordingPath],
|
|
497
|
+
...videos,
|
|
498
|
+
...shotFields,
|
|
499
|
+
resultPath: resultPathFor(journal.recordingPath),
|
|
500
|
+
hangs: hang === undefined ? [] : [hang],
|
|
501
|
+
timing: run.timing,
|
|
502
|
+
stop: run.stop,
|
|
503
|
+
outcome: run.outcome,
|
|
504
|
+
...(run.answer === undefined ? {} : { answer: run.answer }),
|
|
505
|
+
screensObserved: collected.length,
|
|
506
|
+
transcriptPath: journal.transcriptPath,
|
|
507
|
+
screenshotDir,
|
|
508
|
+
evidencePath: evidenceWritten,
|
|
509
|
+
screenshots: capture.screenshots(),
|
|
510
|
+
sideEffects: run.sideEffects,
|
|
511
|
+
...(run.sideEffectsTruncated === undefined ? {} : { sideEffectsTruncated: run.sideEffectsTruncated }),
|
|
512
|
+
...(run.actionDeltas === undefined ? {} : { actionDeltas: run.actionDeltas }),
|
|
513
|
+
engine: currentEngineInfo(),
|
|
514
|
+
...(() => {
|
|
515
|
+
const f = run.failure ?? host.failure ?? jobFailure;
|
|
516
|
+
return f === undefined ? {} : { failure: f };
|
|
517
|
+
})(),
|
|
518
|
+
...(run.crash === undefined ? {} : { crash: run.crash }),
|
|
519
|
+
finalUrl: run.finalUrl,
|
|
520
|
+
decisions: run.decisions,
|
|
521
|
+
actions: run.actions,
|
|
522
|
+
...(runUsage === undefined ? {} : { usage: runUsage.snapshot() }),
|
|
523
|
+
...(hang === undefined ? {} : { hang }),
|
|
524
|
+
// #142 follow-up: reported but never gates `missionOutcome`/`exitCode` — a UX finding is
|
|
525
|
+
// always advisory, and a `server-log` defect here is treated the same way. So is an HTTP 5xx
|
|
526
|
+
// hard-signal defect (#208): listed with its fingerprint (verify-fix replays it), advisory here.
|
|
527
|
+
...serverLogResult(serverLogRun),
|
|
528
|
+
defects: [
|
|
529
|
+
...http5xx.defects(run.transcript, run.recording.pages.flatMap((p) => p.steps)[0]?.step.kind === "navigate" ? 1 : 0).map((d) => ({ ...d, advisory: true })),
|
|
530
|
+
...advisoryDefects(serverLogRun?.defects),
|
|
531
|
+
],
|
|
532
|
+
...(budget === null ? {} : { budget: budget.trajectory() }),
|
|
533
|
+
...(adjudication === undefined
|
|
534
|
+
? {}
|
|
535
|
+
: {
|
|
536
|
+
goalOutcome: adjudication.outcome,
|
|
537
|
+
checks: adjudication.checks,
|
|
538
|
+
...(adjudication.warnings === undefined ? {} : { checkWarnings: adjudication.warnings }),
|
|
539
|
+
}),
|
|
540
|
+
...host.fields,
|
|
541
|
+
};
|
|
542
|
+
if (outcome.kind === "failed") {
|
|
543
|
+
// The analysis is the review's product: without it the review is inconclusive (never a
|
|
544
|
+
// fabricated clean report) — but the run's transcript is kept, and this is a typed result.
|
|
545
|
+
const why = new UxAnalysisFailedError(outcome.reason, outcome.screenId, outcome.rubricItemId).message;
|
|
546
|
+
const missionOutcome = runOutcome === "clean" ? "inconclusive" : runOutcome;
|
|
547
|
+
const unavailable = {
|
|
548
|
+
...base,
|
|
549
|
+
report: null,
|
|
550
|
+
reportPath: null,
|
|
551
|
+
missionOutcome,
|
|
552
|
+
exitCode: missionExitCode(missionOutcome),
|
|
553
|
+
analysisUnavailable: why,
|
|
554
|
+
};
|
|
555
|
+
// Persisted like every other mission's typed result, so MCP `get_mission_result` can read it (#117).
|
|
556
|
+
return await withRunEvidence({ ...unavailable, resultPath: writeMissionResult(journal.recordingPath, missionOutcome, unavailable.exitCode, unavailable, runUsage) }, evidenceOf(opts, [...(opts.secrets ?? []), ...secretFieldSecrets(opts.secretFields)]));
|
|
557
|
+
}
|
|
558
|
+
const report = buildReport(groundFindings(withSignalFindings(outcome, signalFindings), friction), {
|
|
559
|
+
minConfidence,
|
|
560
|
+
quality,
|
|
561
|
+
maxFindingsPerRoute,
|
|
562
|
+
...(product.facts === undefined ? { evidenceCaveats: [NO_PRODUCT_FACTS_CAVEAT] } : {}),
|
|
563
|
+
calibrationCaveats: [calibrationCaveat(opts.appContext.appClass), claimsCaveat()],
|
|
564
|
+
});
|
|
565
|
+
await writeFile(reportPath, `${JSON.stringify(report, null, 2)}\n`, "utf8");
|
|
566
|
+
const reviewed = { ...base, report, reportPath, missionOutcome: runOutcome, exitCode: missionExitCode(runOutcome) };
|
|
567
|
+
return await withRunEvidence({ ...reviewed, resultPath: writeMissionResult(journal.recordingPath, runOutcome, reviewed.exitCode, reviewed, runUsage) }, evidenceOf(opts, [...(opts.secrets ?? []), ...secretFieldSecrets(opts.secretFields)]));
|
|
568
|
+
}
|
|
569
|
+
finally {
|
|
570
|
+
capture.detach();
|
|
571
|
+
disarmKillSwitch();
|
|
572
|
+
health.stop();
|
|
573
|
+
// Safety net: if the mission threw before `serverLog.finish()` ran, close sources immediately
|
|
574
|
+
// (no drain wait) rather than leaving them open until process exit.
|
|
575
|
+
await serverLog?.abort();
|
|
576
|
+
// #159: reaches this even when the mission above threw — the context is still open here.
|
|
577
|
+
await closeSession();
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=ux-usability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ux-usability.js","sourceRoot":"","sources":["../src/ux-usability.ts"],"names":[],"mappings":"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"}
|