Skip to content

CI: report lint errors before the browser tests and run browser specs on four workers - #3566

Merged
integry merged 3 commits into
mainfrom
ci/faster-validate
Nov 14, 2026
Merged

integry merged 3 commits into
mainfrom
ci/faster-validate

Conversation

@integry

@integry integry commented Nov 14, 2026 •

Copy link
Copy Markdown
Owner

Why

Validate Changes takes about an hour on a UI-touching PR. The browser smoke test runs 889 Playwright tests on one worker (about 56 minutes), and lint runs only after it, so a lint warning is reported an hour after the push.

What changes

  • Lint first. Run Checks now runs before the two browser steps, so a lint or typecheck error is reported within a few minutes. When Run Checks fails, the two browser steps are skipped and the job fails without spending the browser time; the browser tests run on the next push once checks pass.
  • Four browser workers. The smoke step sets PROPR_BROWSER_TEST_WORKERS to 4 on GitHub-hosted runners and 2 on self-hosted ones, and propr-ui/playwright.config.ts reads it (default 1, so local runs are unchanged). fullyParallel stays off: files run in parallel, tests inside a file stay in order.
  • creation-short-window.pw.ts is the one long spec whose tests are independent, so it opts into parallel mode within the file.
  • test/ciWorkflowDeduplication.test.mjs asserts the new step order and the worker setting. docs/ci-runners.md and CHANGELOG.md describe the change.

Verification

  • Full browser suite locally with 4 workers: 885 passed, 4 skipped, 0 flaky in 15.7 minutes; pinned to 4 CPUs: 16.7 minutes.
  • node --test test/ciWorkflowDeduplication.test.mjs: 11 of 11 pass.
  • actionlint on pr-build-check.yml: clean.

This PR's own Validate Changes run is the real measurement on a hosted runner.

🤖 Generated with Claude Code

proprdev and others added 2 commits November 14, 2026 02:20
… four workers

Validate Changes spent about 56 of its 60 minutes in the browser smoke test:
889 Playwright tests on one worker, with lint and typecheck only afterwards.

- Run Checks now comes first and a failed gate skips the browser run.
- The browser specs run one file per worker: four workers on hosted runners,
  two on rootless workers; local runs keep one worker.
- creation-short-window.pw.ts, 18% of the suite's test time, spreads its
  independent tests over the workers.

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
@propr-dev

propr-dev Bot commented Nov 14, 2026

Copy link
Copy Markdown
Contributor

CI failed: Validate Changes

Please investigate and fix this CI failure.

Failure evidence

.github:31
Process completed with exit code 1.

.github:1
"The ubuntu-latest label will migrate to Ubuntu 26 beginning October 19, 2026. For more information, see actions/runner-images#14748"

@github-actions

Copy link
Copy Markdown

Checks Failed

Validation failed during setup, tests, CLI packaging, linting, or build checks.

View Logs
Build check diagnostics for run 43578917763, attempt 1
Checkout outcome: success

--- GitHub Actions workflow lint ---
docker.io/rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667: Pulling from rhysd/actionlint
b6b4b7b0e257: Pulling fs layer
4ccd7d76ca98: Pulling fs layer
c09af8888d6a: Pulling fs layer
589002ba0eae: Pulling fs layer
b6b4b7b0e257: Download complete
c09af8888d6a: Download complete
4ccd7d76ca98: Download complete
589002ba0eae: Download complete
402b0b0a10fa: Download complete
c09af8888d6a: Pull complete
589002ba0eae: Pull complete
4ccd7d76ca98: Pull complete
b6b4b7b0e257: Pull complete
Digest: sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667
Status: Downloaded newer image for rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667
docker.io/rhysd/actionlint@sha256:b1934ee5f1c509618f2508e6eb47ee0d3520686341fec936f3b79331f9315667

--- Release shell script lint ---

--- Toolchain ---
v22.23.4
10.9.9

--- Dependency installation ---
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated gar@1.0.4: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
npm warn deprecated glob@7.2.3: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me

added 1112 packages, and audited 1121 packages in 19s

318 packages are looking for funding
  run `npm fund` for details

8 moderate severity vulnerabilities

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.

--- CLI release package ---
Verifying propr-cli release package...

> propr@0.9.1 cli:pack
> node packages/cli/scripts/build-publish.mjs


> @propr/shared@0.9.1 build
> tsc


> @propr/local-setup@0.9.1 build
> tsc


> @propr/cli@0.9.1 build
> tsc && node scripts/copy-assets.mjs

copy-assets: copied 9 file(s) into the CLI package.

Staged propr-cli@0.9.1 at /home/runner/work/propr/propr/dist-publish/propr-cli
npm notice
npm notice 📦  propr-cli@0.9.1
npm notice Tarball Contents
npm notice 26.7kB README.md
npm notice 36.3kB dist/agentSkill.js
npm notice 477B dist/api/admission.js
npm notice 754B dist/api/agentRuntime.js
npm notice 7.1kB dist/api/agents.js
npm notice 2.6kB dist/api/agentTank.js
npm notice 4.4kB dist/api/automations.js
npm notice 11.7kB dist/api/client.js
npm notice 5.0kB dist/api/errors.js
npm notice 1.6kB dist/api/followupHandoffs.js
npm notice 16.9kB dist/api/goals.js
npm notice 6.0kB dist/api/implement.js
npm notice 2.8kB dist/api/index.js
npm notice 1.9kB dist/api/logs.js
npm notice 6.2kB dist/api/plans.js
npm notice 586B dist/api/pullRequests.js
npm notice 4.2kB dist/api/relay.js
npm notice 12.3kB dist/api/repos.js
npm notice 2.5kB dist/api/repositoryEvents.js
npm notice 14.9kB dist/api/settings.js
npm notice 2.0kB dist/api/stats.js
npm notice 1.6kB dist/api/syntheticPools.js
npm notice 1.8kB dist/api/system.js
npm notice 5.9kB dist/api/tasks.js
npm notice 2.9kB dist/api/todos.js
npm notice 86B dist/api/types.js
npm notice 313B dist/api/visualPreviewAuth.js
npm notice 32.9kB dist/assets/env.example.txt
npm notice 5.8kB dist/auth/githubLogin.js
npm notice 8.6kB dist/commands/admissionCommands.js
npm notice 19.7kB dist/commands/agentCommands.js
npm notice 4.2kB dist/commands/agentPoolCommands.js
npm notice 4.3kB dist/commands/agentSkillCommands.js
npm notice 30.0kB dist/commands/agentValidation.js
npm notice 31.2kB dist/commands/automationCommands.js
npm notice 72.3kB dist/commands/checkCommands.js
npm notice 8.9kB dist/commands/configCommands.js
npm notice 14.6kB dist/commands/connectCommand.js
npm notice 11.2kB dist/commands/eventCommands.js
npm notice 5.5kB dist/commands/githubAppApi.js
npm notice 27.7kB dist/commands/githubAppCommands.js
npm notice 60.5kB dist/commands/goalCommands.js
npm notice 8.1kB dist/commands/handoffCommands.js
npm notice 2.4kB dist/commands/imageCommands.js
npm notice 8.0kB dist/commands/implementCommands.js
npm notice 2.0kB dist/commands/index.js
npm notice 8.4kB dist/commands/initCommands.js
npm notice 14.1kB dist/commands/initStack.js
npm notice 6.1kB dist/commands/logCommands.js
npm notice 24.9kB dist/commands/planCommands.js
npm notice 3.1kB dist/commands/prCommands.js
npm notice 8.4kB dist/commands/relayCommands.js
npm notice 38.6kB dist/commands/repoCommands.js
npm notice 2.7kB dist/commands/repoValidate.js
npm notice 7.5kB dist/commands/runtimeCommands.js
npm notice 18.7kB dist/commands/settingCommands.js
npm notice 4.6kB dist/commands/setup/agentHostActions.js
npm notice 123B dist/commands/setup/agents.js
npm notice 4.7kB dist/commands/setup/engine.js
npm notice 51B dist/commands/setup/github.js
npm notice 37.3kB dist/commands/setup/hostActions.js
npm notice 3.2kB dist/commands/setup/imagePlatform.js
npm notice 27.3kB dist/commands/setup/sequential.js
npm notice 51B dist/commands/setup/state.js
npm notice 51B dist/commands/setup/types.js
npm notice 10.7kB dist/commands/setupCommand.js
npm notice 4.4kB dist/commands/stackCommands.js
npm notice 1.4kB dist/commands/startCommand.js
npm notice 4.7kB dist/commands/statsCommands.js
npm notice 4.6kB dist/commands/statsCostCommand.js
npm notice 13.5kB dist/commands/systemCommands.js
npm notice 3.5kB dist/commands/tankCommands.js
npm notice 46.3kB dist/commands/taskCommands.js
npm notice 29.7kB dist/commands/todoCommands.js
npm notice 31.0kB dist/commands/tunnelCommand.js
npm notice 2.7kB dist/commands/uiDocsCommands.js
npm notice 8.3kB dist/completion.js
npm notice 27.3kB dist/config/ConfigManager.js
npm notice 276B dist/config/index.js
npm notice 989B dist/config/rootKey.js
npm notice 345B dist/config/types.js
npm notice 46.0kB dist/connectIdentity.js
npm notice 25.0kB dist/connectRootAuthority.js
npm notice 32.5kB dist/connectWindowsAuthority.js
npm notice 2.2kB dist/desktopDiscovery.js
npm notice 13.3kB dist/desktopLocalSetup.js
npm notice 17.4kB dist/index.js
npm notice 4.5kB dist/native/darwin-authority-broker.c
npm notice 8.9kB dist/native/directory-operations.c
npm notice 50.1kB dist/native/prebuilds/darwin-arm64/connect-authority-broker
npm notice 54.2kB dist/native/prebuilds/darwin-arm64/directory-operations.node
npm notice 17.1kB dist/native/prebuilds/darwin-x64/connect-authority-broker
npm notice 24.3kB dist/native/prebuilds/darwin-x64/directory-operations.node
npm notice 28.9kB dist/native/prebuilds/linux-arm64/directory-operations.node
npm notice 17.4kB dist/native/prebuilds/linux-x64/directory-operations.node
npm notice 1.2kB dist/native/README.md
npm notice 3.1kB dist/orchestrator/format.js
npm notice 13.4kB dist/orchestrator/index.js
npm notice 302B dist/orchestrator/manifest.json
npm notice 131.2kB dist/orchestrator/orchestrator.mjs
npm notice 408B dist/orchestrator/types.js
npm notice 237B dist/skill/propr/agents/openai.yaml
npm notice 8.9kB dist/skill/propr/SKILL.md
npm notice 4.5kB dist/tui/AgentTableApp.js
npm notice 4.5kB dist/tui/app.js
npm notice 11.6kB dist/tui/CheckApp.js
npm notice 5.1kB dist/tui/render.js
npm notice 32.5kB dist/tui/SetupApp.js
npm notice 18.4kB dist/tui/SetupApp.test.js
npm notice 8.2kB dist/tui/StartApp.js
npm notice 3.6kB dist/utils/apiErrorPresentation.js
npm notice 12.0kB dist/utils/directoryDescriptor.js
npm notice 739B dist/utils/dockerPort.js
npm notice 5.0kB dist/utils/envFile.js
npm notice 520B dist/utils/index.js
npm notice 5.7kB dist/utils/io.js
npm notice 717B dist/utils/localSetupPlatform.js
npm notice 1.5kB dist/utils/nativeArtifact.js
npm notice 544B dist/utils/parseState.js
npm notice 417B dist/utils/positiveInteger.js
npm notice 4.5kB dist/utils/privateFilesystem.js
npm notice 4.2kB dist/utils/resolveProject.js
npm notice 7.2kB dist/vendor/local-setup/agents.js
npm notice 64.5kB dist/vendor/local-setup/engine.js
npm notice 5.0kB dist/vendor/local-setup/envFile.js
npm notice 11.4kB dist/vendor/local-setup/github.js
npm notice 188B dist/vendor/local-setup/index.js
npm notice 27.5kB dist/vendor/local-setup/publicInstanceIdentity.js
npm notice 14.6kB dist/vendor/local-setup/state.js
npm notice 2.8kB dist/vendor/local-setup/types.js
npm notice 13.2kB dist/vendor/shared/acceptanceCriteria.js
npm notice 1.0kB dist/vendor/shared/accountStatusTimestamp.js
npm notice 7.7kB dist/vendor/shared/activityEvents.js
npm notice 2.8kB dist/vendor/shared/agentConfigRedaction.js
npm notice 4.4kB dist/vendor/shared/agentDefinitions.js
npm notice 2.3kB dist/vendor/shared/agentFailureLine.js
npm notice 3.4kB dist/vendor/shared/agentLogin.js
npm notice 3.1kB dist/vendor/shared/agentTank.js
npm notice 1.2kB dist/vendor/shared/agentTankHistory.js
npm notice 2.8kB dist/vendor/shared/analyticsTimeframe.js
npm notice 4.4kB dist/vendor/shared/antigravityCompatibility.js
npm notice 5.1kB dist/vendor/shared/apiOrigin.js
npm notice 3.5kB dist/vendor/shared/assignment.js
npm notice 17.2kB dist/vendor/shared/automationDefinitions.js
npm notice 2.4kB dist/vendor/shared/automationRunProductivity.js
npm notice 6.4kB dist/vendor/shared/automationTemplateContract.js
npm notice 18.5kB dist/vendor/shared/automationTemplates.catalog.json
npm notice 1.3kB dist/vendor/shared/automationTemplates.js
npm notice 3.4kB dist/vendor/shared/changedFileKinds.js
npm notice 1.4kB dist/vendor/shared/claudeCompatibility.js
npm notice 8.5kB dist/vendor/shared/connectDiscovery.js
npm notice 9.6kB dist/vendor/shared/cronSchedule.js
npm notice 254B dist/vendor/shared/demoMode.js
npm notice 4.3kB dist/vendor/shared/desktopPairing.js
npm notice 481B dist/vendor/shared/desktopTokenRevocation.js
npm notice 8.9kB dist/vendor/shared/events.js
npm notice 13.0kB dist/vendor/shared/extensionLibrary.js
npm notice 703B dist/vendor/shared/extensionOAuth.js
npm notice 4.0kB dist/vendor/shared/extensionPackages.js
npm notice 2.9kB dist/vendor/shared/extensionProfiles.js
npm notice 2.7kB dist/vendor/shared/fleetData.js
npm notice 2.5kB dist/vendor/shared/githubAppManifest.js
npm notice 1.6kB dist/vendor/shared/githubAuthMode.js
npm notice 2.0kB dist/vendor/shared/githubEventIntakeMode.js
npm notice 12.8kB dist/vendor/shared/goalBlockers.js
npm notice 6.0kB dist/vendor/shared/goalCheckpoints.js
npm notice 4.0kB dist/vendor/shared/goalCreation.js
npm notice 5.1kB dist/vendor/shared/goalWait.js
npm notice 14.1kB dist/vendor/shared/index.js
npm notice 214B dist/vendor/shared/instanceAuthorization.js
npm notice 54B dist/vendor/shared/instanceCatalog.js
npm notice 584B dist/vendor/shared/instanceStorage.js
npm notice 4.0kB dist/vendor/shared/intakeModePrerequisites.js
npm notice 2.9kB dist/vendor/shared/labelUtils.js
npm notice 18.7kB dist/vendor/shared/modelDefinitions.js
npm notice 3.5kB dist/vendor/shared/notificationLinks.js
npm notice 51.3kB dist/vendor/shared/notifications.js
npm notice 2.7kB dist/vendor/shared/openCodeCompatibility.js
npm notice 16.9kB dist/vendor/shared/planItemGraph.js
npm notice 7.5kB dist/vendor/shared/previewStorage/v1.js
npm notice 866B dist/vendor/shared/projectSlug.js
npm notice 3.8kB dist/vendor/shared/proprCompatibility.js
npm notice 13.0kB dist/vendor/shared/proprServiceUrls.js
npm notice 16.8kB dist/vendor/shared/prTemplate.js
npm notice 2.2kB dist/vendor/shared/publishedVisualPreviews.js
npm notice 2.7kB dist/vendor/shared/reasoningLevels.js
npm notice 1.8kB dist/vendor/shared/repositoryEvents.js
npm notice 6.7kB dist/vendor/shared/repositoryEventWait.js
npm notice 1.2kB dist/vendor/shared/repositoryIcon.js
npm notice 1.4kB dist/vendor/shared/repositoryIconUrl.js
npm notice 3.9kB dist/vendor/shared/repositoryPresentation.js
npm notice 9.6kB dist/vendor/shared/reviewContextBudget.js
npm notice 5.8kB dist/vendor/shared/reviewFeedbackIds.js
npm notice 2.7kB dist/vendor/shared/reviewPrompt.js
npm notice 907B dist/vendor/shared/runCostCap.js
npm notice 861B dist/vendor/shared/sessionSecret.js
npm notice 392B dist/vendor/shared/sqliteTimestamp.js
npm notice 603B dist/vendor/shared/statusKeys.js
npm notice 7.5kB dist/vendor/shared/syntheticAgents.js
npm notice 2.2kB dist/vendor/shared/taskIdentifiers.js
npm notice 2.0kB dist/vendor/shared/taskLifecycle.js
npm notice 733B dist/vendor/shared/taskReplacement.js
npm notice 957B dist/vendor/shared/text.js
npm notice 2.6kB dist/vendor/shared/tokenOutlierSettings.js
npm notice 9.8kB dist/vendor/shared/usageTips.catalog.json
npm notice 5.0kB dist/vendor/shared/usageTips.js
npm notice 335B dist/vendor/shared/usageTypes.js
npm notice 1.1kB dist/vendor/shared/userWhitelist.js
npm notice 758B dist/vendor/shared/validateRelayUrl.js
npm notice 2.2kB dist/vendor/shared/validateRoutingUrl.js
npm notice 7.1kB dist/vendor/shared/visualPreviewCapacity.js
npm notice 9.3kB dist/vendor/shared/voice.js
npm notice 222B dist/vendor/shared/workEvidence.js
npm notice 828B package.json
npm notice Tarball Details
npm notice name: propr-cli
npm notice version: 0.9.1
npm notice filename: propr-cli-0.9.1.tgz
npm notice package size: 527.7 kB
npm notice unpacked size: 2.1 MB
npm notice shasum: fac0fb2604f98a5ee003c02c95d90140c79646cd
npm notice integrity: sha512-Ve3IDplrDwCfJ[...]0ZD3CtIC0MCFg==
npm notice total files: 214
npm notice
propr-cli-0.9.1.tgz

Dry run only. Re-run with --publish to publish to npm.
✅ propr-cli release package verified
Starting changed-area validation process...
Reusing this job's @propr/shared build from CLI packaging.
Reusing this job's @propr/local-setup build from CLI packaging.

--- Core Service: Lint & Build ---
✅ Core Lint passed
✅ Core Source Build passed

--- UI: Typecheck, Lint & Build ---
✅ Client Package validation passed
✅ UI Typecheck passed
✅ UI Lint passed
✅ UI Build passed

--- Docs: Typecheck & Build ---
✅ Docs Typecheck passed
✅ Docs Build passed
✅ Docs Static Serving Check passed

--- Core Package: Build & Lint ---
✅ Core Package Build passed
✅ Core Package Lint passed

--- CLI: Lint ---
✅ CLI Lint passed

--- API: Build & Lint ---
✅ API Build passed
✅ API Lint passed

--- API Reference: OpenAPI Spec & Client Contract ---
✅ OpenAPI spec is current and valid
✅ @propr/client matches the OpenAPI spec

--- Stage outcomes ---
Workflow lint: success
Release shell lint: success
Pre-setup gate: skipped
Node setup: success
Toolchain: success
Dependency install: success
Release metadata: success
CLI packaging: success
Change detection: success
Changed-area checks: success

View Workflow

@propr-dev

propr-dev Bot commented Nov 14, 2026

Copy link
Copy Markdown
Contributor

CI failed: Full Test Suite Shard 2/4

Please investigate and fix this CI failure.

  • Check: Full Test Suite Shard 2/4
  • Result: failure
  • Commit: 3c75e9f2548e (3c75e9f2548eac65d29dda6f39e6666f323353bf)
  • Details: View CI failure

Failure evidence

.github:11
Process completed with exit code 1.

.github:40897
Process completed with exit code 1.

.github:2
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/

@propr-dev

propr-dev Bot commented Nov 14, 2026

Copy link
Copy Markdown
Contributor

CI failed: Full Test Suite Shard 4/4

Please investigate and fix this CI failure.

  • Check: Full Test Suite Shard 4/4
  • Result: failure
  • Commit: 3c75e9f2548e (3c75e9f2548eac65d29dda6f39e6666f323353bf)
  • Details: View CI failure

Failure evidence

.github:11
Process completed with exit code 1.

.github:41792
Process completed with exit code 1.

.github:2
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/

@propr-dev

propr-dev Bot commented Nov 14, 2026

Copy link
Copy Markdown
Contributor

CI failed: Run Full Test Suite

Please investigate and fix this CI failure.

Failure evidence

.github:68
Process completed with exit code 1.

.github:66
Full test suite shards finished with result 'failure'.

.github:4
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960, actions/download-artifact@018cc2c. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/

@github-actions

Copy link
Copy Markdown

Full Test Suite Results

Validation failed during: Test shard (shard 2), Test shard (shard 4).

  • Dependency install: success
  • Workspace build: success
  • Docs validation: success
  • Shard coverage verification: success
  • Hosted native Electron units: skipped (classifier decision: false)
  • Shard 1/4: passed in 1028.0s on GitHub Actions 1000118782
  • Shard 2/4: failed during Test shard in 1032.2s on GitHub Actions 1000118781
    • apps/desktop/scripts/rpm-signing.test.mjs: exit 1
  • Shard 3/4: passed in 844.7s on GitHub Actions 1000118779
  • Shard 4/4: failed during Test shard in 1086.1s on GitHub Actions 1000118783
    • apps/desktop/src/rpm-maker.test.ts: exit 1
View shard 2/4 output
...(truncated)

b
�[22m�[39mFailed to load indexed repositories: ProprClientError: The ProPR API could not be reached.
    at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:293:13)
    at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
    at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
    at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
  kind: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

�[90mstderr�[2m | src/components/Repositories/RepoMediaPanel.test.tsx�[2m > �[22m�[2mrepository Media lightbox�[2m > �[22m�[2mplays a video inline in the dialog with its native controls
�[22m�[39mFailed to load indexed repositories: ProprClientError: The ProPR API could not be reached.
    at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:293:13)
    at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
    at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
    at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
  kind: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

�[90mstderr�[2m | src/components/Repositories/RepoMediaPanel.test.tsx�[2m > �[22m�[2mrepository Media lightbox�[2m > �[22m�[2mcloses on the close button and restores focus to the tile that opened it
�[22m�[39mFailed to load indexed repositories: ProprClientError: The ProPR API could not be reached.
    at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:293:13)
    at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
    at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
    at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
  kind: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

�[90mstderr�[2m | src/components/Repositories/RepoMediaPanel.test.tsx�[2m > �[22m�[2mrepository Media lightbox�[2m > �[22m�[2mcloses on the backdrop and restores focus to the tile that opened it
�[22m�[39mFailed to load indexed repositories: ProprClientError: The ProPR API could not be reached.
    at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:293:13)
    at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
    at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
    at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
  kind: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

�[90mstderr�[2m | src/components/Repositories/RepoMediaPanel.test.tsx�[2m > �[22m�[2mrepository Media lightbox�[2m > �[22m�[2mcloses on Escape and restores focus to the tile that opened it
�[22m�[39mFailed to load indexed repositories: ProprClientError: The ProPR API could not be reached.
    at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:293:13)
    at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
    at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
    at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
  kind: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

�[90mstderr�[2m | src/components/Repositories/RepoMediaPanel.test.tsx�[2m > �[22m�[2mrepository Media lightbox�[2m > �[22m�[2mnavigates the whole collection with controls and arrow keys, wrapping at both ends
�[22m�[39mFailed to load indexed repositories: ProprClientError: The ProPR API could not be reached.
    at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:293:13)
    at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
    at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
    at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
  kind: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

 �[32m✓�[39m src/components/Repositories/RepoMediaPanel.test.tsx �[2m(�[22m�[2m12 tests�[22m�[2m)�[22m�[33m 1012�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/electronAdapters.selectionFence.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 15�[2mms�[22m�[39m
 �[32m✓�[39m src/App.hostedFlow.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 1892�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/ReviewContextSettings.test.tsx �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 279�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/demoViewer.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 404�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/useLiveRefreshScheduler.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 39�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/useHeaderStats.status.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 294�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/AddRepositoryModal.test.tsx�[2m > �[22m�[2mAddRepositoryModal�[2m > �[22m�[2mkeeps branch selection in the scroll-owned form and submits through one form path
�[22m�[39mIn HTML, <button> cannot be a descendant of <button>.
This will cause a hydration error.

  <AddRepositoryModal isOpen={true} newRepo="integry/propr" newAlias="Production" newBaseBranch="release/20..." ...>
    <div className="fixed inse..." onClick={function handleBackdropClick}>
      <div ref={{...}} role="dialog" aria-modal="true" aria-labelledby="_r_9_" tabIndex={-1} className="bg-white r...">
        <div>
        <form onSubmit={function handleSubmit} className="flex min-h...">
          <div data-testid="add-reposi..." className="min-h-0 fl...">
            <div>
            <div>
            <div>
              <label>
              <BaseBranchSelector repoName="integry/propr" value="release/20..." onChange={function Mock} ...>
                <div className="relative" ref={{...}}>
>                 <button
>                   id="_r_d_"
>                   type="button"
>                   onClick={function handleOpen}
>                   disabled={false}
>                   aria-labelledby="_r_e_ _r_h_"
>                   aria-describedby="_r_f_"
>                   aria-haspopup="listbox"
>                   aria-expanded={false}
>                   className="w-full px-3 py-2 text-left bg-white border border-gray-300 rounded-md font-mono text-sm..."
>                 >
                    <span>
                    <div className="flex items...">
>                     <button
>                       type="button"
>                       onClick={function handleClear}
>                       className="p-0.5 hover:bg-gray-200 rounded text-gray-400 hover:text-gray-600"
>                       title="Clear selection"
>                     >
                      ...
              ...
            ...
          ...

<button> cannot contain a nested <button>.
See this log for the ancestor stack trace.

 �[32m✓�[39m src/components/AddRepositoryModal.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 470�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/SetupWizardHeaders.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 262�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/VisualPreviewAuthSection.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 347�[2mms�[22m�[39m
 �[32m✓�[39m src/components/SystemHealthPush.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 450�[2mms�[22m�[39m
 �[32m✓�[39m src/components/SummaryBrowser/index.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 147�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/extensions/ExtensionOAuthServerName.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 359�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/Agents/AgentEditor.templates.test.tsx�[2m > �[22m�[2mAgentEditor templates�[2m > �[22m�[2mopens prefilled from the template named in the link
�[22m�[39mAn update to AgentScopeSection inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentEditor inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentEditor inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/components/Agents/AgentEditor.templates.test.tsx�[2m > �[22m�[2mAgentEditor templates�[2m > �[22m�[2mopens an empty form for an unknown template
�[22m�[39mAn update to AgentScopeSection inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentEditor inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentEditor inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/components/Agents/AgentEditor.templates.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 806�[2mms�[22m�[39m
   �[32m✓�[39m AgentEditor templates �[2m(5)�[22m
     �[33m�[2m✓�[22m�[39m prefills the form from a chosen template and creates nothing until the user saves�[33m 588�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/PlanEditorHeader.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 342�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/AiAgentsPlaygroundSession.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 662�[2mms�[22m�[39m
   �[32m✓�[39m AiAgentsPage Playground session �[2m(3)�[22m
     �[33m�[2m✓�[22m�[39m shows one unsent draft in both layouts and keeps it across mobile tabs�[33m 386�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/DesktopWindowControls.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 191�[2mms�[22m�[39m
 �[32m✓�[39m src/components/GlobalHeader.nativeCreation.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 341�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Analytics/activityAxis.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 24�[2mms�[22m�[39m
 �[32m✓�[39m src/api/extensionSelectionHeaders.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Goals/goalTimeline.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/WorkflowSettingsSection.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 340�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/TaskPlanner/usePlanQueueActions.test.ts�[2m > �[22m�[2mPlanner Studio queue actions�[2m > �[22m�[2ma refused action surfaces its error and rereads the queue
�[22m�[39mFailed to skip issue #1: Error: Issue #1 is in flight; wait for its run to finish or block.
    at �[90m/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/usePlanQueueActions.test.ts:52:32
    at file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:1632:35
    at file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:2801:26
    at file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:3338:20
    at new Promise (<anonymous>)
    at runWithCancel (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:3333:10)
    at file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:3318:20
    at new Promise (<anonymous>)
    at runWithTimeout (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:3276:10)
    at file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:3904:64

 �[32m✓�[39m src/components/TaskPlanner/usePlanQueueActions.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 26�[2mms�[22m�[39m
 �[32m✓�[39m src/api/triggerWhitelistApi.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/components/AgentChat/ModelSelector.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 479�[2mms�[22m�[39m
   �[32m✓�[39m ModelSelector keyboard navigation �[2m(4)�[22m
     �[33m�[2m✓�[22m�[39m scrolls to and selects an active option beyond the initial viewport�[33m 338�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/McpServerSection.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 237�[2mms�[22m�[39m
 �[32m✓�[39m src/api/apiClient.accounts.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 21�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/DesktopExperience.shortcut-readiness.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 251�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Agents/AgentEditor.deleteWhileSaving.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 402�[2mms�[22m�[39m
   �[32m✓�[39m AgentEditor deletion while saving �[2m(2)�[22m
     �[33m�[2m✓�[22m�[39m disables Delete while a save is pending�[33m 344�[2mms�[22m�[39m
 �[32m✓�[39m src/api/compatibility.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 519�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/PlanEditor.responsive.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 48�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/browserAdapters.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 20�[2mms�[22m�[39m
 �[32m✓�[39m src/App.hostedCompletion.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 160�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/PlansPageUtils.test.tsx �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 8�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/PushFailureDetails.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 238�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/LoginPage.authError.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 237�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SummaryBrowserPage.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 54�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Dashboard/workTitle.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Analytics/activityPairs.test.ts �[2m(�[22m�[2m23 tests�[22m�[2m)�[22m�[32m 8�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/DesktopPresentationBoundary.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 228�[2mms�[22m�[39m
 �[32m✓�[39m src/components/ActivitySparkline.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 151�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/ThinkingLog.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 221�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/AgentTankSection.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 172�[2mms�[22m�[39m
 �[32m✓�[39m src/api/usageTipsApi.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/components/GlobalSearch.scrollbar.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/contexts/SystemStatusContext.push.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 30�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/useAnchoredPopover.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/utils/modalBackground.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 27�[2mms�[22m�[39m
 �[32m✓�[39m src/components/RepositoryListItem.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 167�[2mms�[22m�[39m
�[90mstderr�[2m | src/hooks/useDecoratedRepoOptions.test.tsx�[2m > �[22m�[2museDecoratedRepoOptions�[2m > �[22m�[2mpasses through undefined options
�[22m�[39mAn update to TestComponent inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/hooks/useDecoratedRepoOptions.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 74�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/useAgentTankSuggestion.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 80�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/SectionLabelHeader.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 187�[2mms�[22m�[39m
 �[32m✓�[39m src/components/workflowSelectionInput.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/useInboxSelection.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 18�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/PlansPageComponents.owner.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 57�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/UsageTipsSettingsSection.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 67�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/settingsCategoryGuides.test.ts �[2m(�[22m�[2m21 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/utils/notificationIntents.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m88 passed�[39m�[22m�[90m (88)�[39m
�[2m      Tests �[22m �[1m�[32m817 passed�[39m�[22m�[90m (817)�[39m
�[2m   Start at �[22m 09:23:15
�[2m   Duration �[22m 78.74s�[2m (environment 38%, tests 34%, import 15%, setup 7%, transform 5%)�[22m

�[2mEnvironment �[22m �[33mjsdom was created 88 times�[39m�[2m · 56.46s total, 38% of tracked time�[22m
�[2m            �[22m �[2mcreate it once per worker with �[22m�[33mpool: 'vmThreads'�[39m�[2m (keeps per-file isolation) or �[22m�[33misolate: false�[39m�[2m (shares it across files)�[22m
�[2m            �[22m �[2mlearn more: https://vitest.dev/guide/improving-performance#test-environments�[22m


> propr-ui@0.0.1 posttest
> npm run test:docker-context


> propr-ui@0.0.1 test:docker-context
> node --test scripts/docker-context-inputs.test.mjs

TAP version 13
# Subtest: focused UI selectors are forwarded only to Vitest
ok 1 - focused UI selectors are forwarded only to Vitest
  ---
  duration_ms: 0.710971
  type: 'test'
  ...
# Subtest: the UI Docker context contains its complete non-type external source import closure
ok 2 - the UI Docker context contains its complete non-type external source import closure
  ---
  duration_ms: 51.408667
  type: 'test'
  ...
1..2
# tests 2
# suites 0
# pass 2
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 100.455054
[268/268] passed propr-ui#3/4 (workspace test script) in 79.4s

### Shard 2/4: 267/268 passed in 1032.2s

Assigned 268 of 1071 discovered units.

| Duration | Status | Unit |
| ---: | --- | --- |
| 79.4s | passed | `propr-ui#3/4` (workspace) |
| 62.2s | passed | `test/routingDeliveryInterest.test.ts` |
| 45.5s | passed | `test/agentRunUnproductiveStreakRecovery.test.ts` |
| 40.7s | passed | `test/agentRunProductivity.test.ts` |
| 38.9s | passed | `packages/api/test/mcpBrowser.test.ts` |
| 31.7s | passed | `apps/desktop/scripts/signing-key-verification.test.mjs` |
| 31.3s | passed | `test/agentAutonomy.test.ts` |
| 26.7s | passed | `apps/desktop/scripts/desktop-native-menu.test.mjs` |
| 26.1s | passed | `test/agentRunStore.test.ts` |
| 19.4s | failed | `apps/desktop/scripts/rpm-signing.test.mjs` |
| 18.5s | passed | `test/connectCliIntegration.test.ts` |
| 17.2s | passed | `packages/api/test/goalBlockerNotifications.test.ts` |
| 16.8s | passed | `test/extensionLibraryMigrationReadiness.test.ts` |
| 16.2s | passed | `test/daemon.test.ts` |
| 15.6s | passed | `packages/core/test/executeDraftDependencies.test.ts` |


1/268 test runs failed in shard 2/4 after 1032.2s:
- apps/desktop/scripts/rpm-signing.test.mjs: exit 1

View shard 4/4 output
...(truncated)

ft (desktop=true)�[2m > �[22m�[2mafter the user leaves a pending fresh plan�[2m > �[22m�[2mkeeps another opened draft untouched when the acknowledgement arrives
�[22m�[39mAn update to PlanStudioPage inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to PlanStudioPage inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/PlanStudioPage.freshGenerate.test.tsx�[2m > �[22m�[2mfresh plan generation becomes the displayed draft (desktop=true)�[2m > �[22m�[2mafter the user leaves a pending fresh plan�[2m > �[22m�[2mdoes not rewrite the plans entry when the draft is created after Back
�[22m�[39mFailed to save planner settings to localStorage

�[90mstderr�[2m | src/pages/PlanStudioPage.freshGenerate.test.tsx�[2m > �[22m�[2mfresh plan generation becomes the displayed draft (desktop=true)�[2m > �[22m�[2mafter the user leaves a pending fresh plan�[2m > �[22m�[2mdoes not rewrite the plans entry when the draft is created after Back
�[22m�[39mFailed to save planner settings to localStorage

 �[32m✓�[39m src/components/TaskDetails/useTaskAssignment.test.tsx �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[33m 804�[2mms�[22m�[39m
�[90mstdout�[2m | src/pages/PlanStudioPage.freshGenerate.test.tsx�[2m > �[22m�[2mfresh plan generation becomes the displayed draft (desktop=true)�[2m > �[22m�[2mafter the user leaves a pending fresh plan�[2m > �[22m�[2mdoes not rewrite the plans entry when the draft is created after Back
�[22m�[39m[useDraft] Received draft update via WebSocket: {
  draftId: �[32m'draft-1'�[39m,
  timestamp: �[32m'2026-11-14T09:24:43.869Z'�[39m,
  runId: �[32m'run-1'�[39m,
  draftStatus: �[32m'review'�[39m
}

�[90mstderr�[2m | src/pages/PlanStudioPage.freshGenerate.test.tsx�[2m > �[22m�[2mfresh plan generation becomes the displayed draft (desktop=true)�[2m > �[22m�[2mafter the user leaves a pending fresh plan�[2m > �[22m�[2mdoes not rewrite the plans entry when the draft is created after Back
�[22m�[39mAn update to PlanStudioPage inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to PlanStudioPage inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/pages/PlanStudioPage.freshGenerate.test.tsx �[2m(�[22m�[2m14 tests�[22m�[2m)�[22m�[33m 18524�[2mms�[22m�[39m
   �[32m✓�[39m fresh plan generation becomes the displayed draft (desktop=false) �[2m(7)�[22m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate races the autosave debounce (stale read before the acknowledgement)�[33m 1879�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate races the autosave debounce (stale read after the acknowledgement)�[33m 1565�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate follows an in-place autosave�[33m 1529�[2mms�[22m�[39m
     �[32m✓�[39m after the user leaves a pending fresh plan �[2m(3)�[22m
       �[33m�[2m✓�[22m�[39m keeps the plans list when the acknowledgement arrives after Back�[33m 1473�[2mms�[22m�[39m
       �[33m�[2m✓�[22m�[39m keeps another opened draft untouched when the acknowledgement arrives�[33m 1483�[2mms�[22m�[39m
       �[33m�[2m✓�[22m�[39m does not rewrite the plans entry when the draft is created after Back�[33m 1444�[2mms�[22m�[39m
   �[32m✓�[39m fresh plan generation becomes the displayed draft (desktop=true) �[2m(7)�[22m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate races the autosave debounce (stale read before the acknowledgement)�[33m 1518�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate races the autosave debounce (stale read after the acknowledgement)�[33m 1467�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate follows an in-place autosave�[33m 1538�[2mms�[22m�[39m
     �[32m✓�[39m after the user leaves a pending fresh plan �[2m(3)�[22m
       �[33m�[2m✓�[22m�[39m keeps the plans list when the acknowledgement arrives after Back�[33m 1427�[2mms�[22m�[39m
       �[33m�[2m✓�[22m�[39m keeps another opened draft untouched when the acknowledgement arrives�[33m 1488�[2mms�[22m�[39m
       �[33m�[2m✓�[22m�[39m does not rewrite the plans entry when the draft is created after Back�[33m 1448�[2mms�[22m�[39m
�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2mpreserves distinct migrated effort labels when editing and saving an Antigravity agent
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2madds a loginable agent with an isolated managed credential path and requests login
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2mallows a new agent to reuse an existing config directory instead of logging in
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2muses the agent alias in long model labels
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2msaves a model-specific reasoning level for Codex agents
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2mmarks a legacy cross-agent reasoning value as unsupported
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2moffers one Antigravity entry per model with model-specific reasoning choices
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/pages/SettingsPage/AgentConfigModal.test.tsx �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[33m 1394�[2mms�[22m�[39m
   �[32m✓�[39m AgentConfigModal �[2m(8)�[22m
     �[33m�[2m✓�[22m�[39m preserves distinct migrated effort labels when editing and saving an Antigravity agent�[32m 300�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/ContextStrip.test.tsx �[2m(�[22m�[2m17 tests�[22m�[2m)�[22m�[33m 493�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/TaskVisualPreviews.test.tsx �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[33m 580�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/LogFilesModal.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 595�[2mms�[22m�[39m
   �[32m✓�[39m LogFilesModal �[2m(3)�[22m
     �[33m�[2m✓�[22m�[39m searches literal metacharacters, counts what it highlights, and steps through matches�[33m 429�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/TaskDetails/ReviewScoreHistory.test.tsx�[2m > �[22m�[2musePullRequestScores�[2m > �[22m�[2mnever returns a previous PR's history for a new PR, while loading or after a failed read
�[22m�[39mAn update to TestComponent inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/components/TaskDetails/ReviewScoreHistory.test.tsx �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[33m 362�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/TaskDetails/LatestRunCommands.projection.test.tsx�[2m > �[22m�[2mfollow-up commands read from the API task projection�[2m > �[22m�[2mthe task header keeps /fix for findings and sends it only after the projection is read again
�[22m�[39mAn update to FollowupCommands inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/components/TaskDetails/LatestRunCommands.projection.test.tsx �[2m(�[22m�[2m13 tests�[22m�[2m)�[22m�[32m 245�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/PlanStudioPage.inPlaceDraft.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 275�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/index.followupTarget.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 615�[2mms�[22m�[39m
   �[32m✓�[39m the follow-up dialog names the thread its submission posts to �[2m(7)�[22m
     �[33m�[2m✓�[22m�[39m an issue implementation that created a PR names that PR and submits that task ID�[33m 305�[2mms�[22m�[39m
 �[32m✓�[39m src/components/ui/Skeleton.test.tsx �[2m(�[22m�[2m12 tests�[22m�[2m)�[22m�[32m 266�[2mms�[22m�[39m
 �[32m✓�[39m src/components/ApplicationShell.idle.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 83�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop-deep-link.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 18�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/AgentRuntimePackagesSection.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 761�[2mms�[22m�[39m
   �[32m✓�[39m AgentRuntimePackagesSection �[2m(7)�[22m
     �[33m�[2m✓�[22m�[39m offers catalog suggestions and validates a selected package�[33m 356�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Goals/GoalAttentionPanel.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 391�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/NotificationSettingsSection.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 1099�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/FollowupModal.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 423�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/AgentNetworkSettingsSection.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 357�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/planDisplayName.test.ts �[2m(�[22m�[2m17 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
 �[32m✓�[39m src/api/currentUserResponse.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 14�[2mms�[22m�[39m
�[90mstdout�[2m | src/components/TaskDetails/LiveFileChips.test.tsx�[2m > �[22m�[2mLiveFileChips live refreshes�[2m > �[22m�[2mturns the fixture baseline of three burst invalidations into one additional file-changes request
�[22m�[39m[LiveFileChips] Received task update, refreshing file changes: { taskId: �[32m'task-1'�[39m }
[LiveFileChips] Received task update, refreshing file changes: { taskId: �[32m'task-1'�[39m }
[LiveFileChips] Received task update, refreshing file changes: { taskId: �[32m'task-1'�[39m }

 �[32m✓�[39m src/components/TaskDetails/LiveFileChips.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 402�[2mms�[22m�[39m
   �[32m✓�[39m LiveFileChips live refreshes �[2m(3)�[22m
     �[33m�[2m✓�[22m�[39m shows the shared directory once with 32 filenames ordered by changed lines and keeps every diff accessible�[33m 333�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/PlanIssuesManager.notificationIntent.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 595�[2mms�[22m�[39m
   �[32m✓�[39m PlanIssuesManager execution intent �[2m(3)�[22m
     �[33m�[2m✓�[22m�[39m cancel closes without starting implementation�[33m 348�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskList/hooks.lazyRoute.test.tsx �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[33m 410�[2mms�[22m�[39m
 �[32m✓�[39m src/components/globalSearchModel.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 13�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/PlanEditor.notificationIntent.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 588�[2mms�[22m�[39m
   �[32m✓�[39m PlanEditor notification intents �[2m(4)�[22m
     �[33m�[2m✓�[22m�[39m never approves from navigation and cancel leaves the plan unchanged�[33m 525�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/useCurrentUserBootstrap.mainProxy.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 74�[2mms�[22m�[39m
 �[32m✓�[39m src/components/RepositoryAutoAssignControl.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 298�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/packagedAcceptanceRendererLifecycle.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/TaskCard.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 554�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/planIssueDefaultSelection.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/AgentWatchdogSettingsSection.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 117�[2mms�[22m�[39m
�[90mstdout�[2m | src/components/TaskDetails/useTaskData.completion.test.ts�[2m > �[22m�[2mreplaces the live view of a subscribed client with persisted details when the task completes
�[22m�[39m[useTaskData] Received task update via WebSocket: { taskId: �[32m'task'�[39m, state: �[32m'COMPLETED'�[39m }

 �[32m✓�[39m src/components/TaskDetails/useTaskData.completion.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 35�[2mms�[22m�[39m
 �[32m✓�[39m src/api/dashboardApi.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 25�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/VoiceSettingsSection.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 324�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/DesktopExperience.accounts.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 482�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Agents/AgentEditor.eventTrigger.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 73�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/generationTelemetryUtils.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/PromptModal.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[33m 320�[2mms�[22m�[39m
   �[32m✓�[39m PromptModal �[2m(1)�[22m
     �[33m�[2m✓�[22m�[39m is a named modal dialog with a labelled close, Tab containment and focus return�[33m 318�[2mms�[22m�[39m
 �[32m✓�[39m src/components/UserAvatar.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 214�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/setupWizardHooks.editMode.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 29�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/RepositoryAutoResolveConflictsControl.test.tsx�[2m > �[22m�[2mRepositoryAutoResolveConflictsControl�[2m > �[22m�[2mreflects a stored override
�[22m�[39mAn update to RepositoryAutoResolveConflictsControl inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/components/RepositoryAutoResolveConflictsControl.test.tsx�[2m > �[22m�[2mRepositoryAutoResolveConflictsControl�[2m > �[22m�[2msets always, never, and inherit (null)
�[22m�[39mAn update to RepositoryAutoResolveConflictsControl inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/components/RepositoryAutoResolveConflictsControl.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 221�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/ContextLevelSlider.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 58�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modalShells.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 246�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskList/durations.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 8�[2mms�[22m�[39m
 �[32m✓�[39m src/components/RouteChunkErrorBoundary.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 214�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/PlanEditorDesktopLayout.assistant.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 256�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/useSelectedModelMaxTokens.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 82�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/scopedTaskEvents.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/setupWizardDraftConfig.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskList/Pagination.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 274�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/TaskCardList.breakpoint.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 235�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/repositoryNonBlockingChecks.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 8�[2mms�[22m�[39m
 �[32m✓�[39m src/api/automationRunTrigger.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Agents/AgentAutonomySection.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 216�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/InboxPageComponents.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 201�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/syntaxHighlighter.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/taskKind.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/api/proprApi.instanceCatalog.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/AssignmentControl.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 211�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Dashboard/KPICard.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 56�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/executionConfigSummary.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Repositories/RepoBrowsePanel.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 27�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/RefinementChat.focus.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 170�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/ExecutionEventUtils.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/tokenFormat.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m88 passed�[39m�[22m�[90m (88)�[39m
�[2m      Tests �[22m �[1m�[32m756 passed�[39m�[22m�[90m (756)�[39m
�[2m   Start at �[22m 09:23:58
�[2m   Duration �[22m 90.27s�[2m (tests 39%, environment 34%, import 14%, setup 7%, transform 6%)�[22m

�[2mEnvironment �[22m �[33mjsdom was created 88 times�[39m�[2m · 57.98s total, 34% of tracked time�[22m
�[2m            �[22m �[2mcreate it once per worker with �[22m�[33mpool: 'vmThreads'�[39m�[2m (keeps per-file isolation) or �[22m�[33misolate: false�[39m�[2m (shares it across files)�[22m
�[2m            �[22m �[2mlearn more: https://vitest.dev/guide/improving-performance#test-environments�[22m


> propr-ui@0.0.1 posttest
> npm run test:docker-context


> propr-ui@0.0.1 test:docker-context
> node --test scripts/docker-context-inputs.test.mjs

TAP version 13
# Subtest: focused UI selectors are forwarded only to Vitest
ok 1 - focused UI selectors are forwarded only to Vitest
  ---
  duration_ms: 0.800679
  type: 'test'
  ...
# Subtest: the UI Docker context contains its complete non-type external source import closure
ok 2 - the UI Docker context contains its complete non-type external source import closure
  ---
  duration_ms: 53.563759
  type: 'test'
  ...
1..2
# tests 2
# suites 0
# pass 2
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 107.198274
[267/267] passed propr-ui#1/4 (workspace test script) in 91.0s

### Shard 4/4: 266/267 passed in 1086.1s

Assigned 267 of 1071 discovered units.

| Duration | Status | Unit |
| ---: | --- | --- |
| 91.0s | passed | `propr-ui#1/4` (workspace) |
| 64.7s | passed | `packages/api/test/mcpAccessLog.test.ts` |
| 64.4s | passed | `packages/api/test/mcpAgentRuns.test.ts` |
| 42.7s | passed | `apps/desktop/src/profile-store.crash-recovery.test.ts` |
| 40.5s | passed | `packages/api/test/planRevisions.test.ts` |
| 39.2s | passed | `packages/api/test/mcpPublishPlan.test.ts` |
| 36.9s | passed | `packages/core/test/managedDiagnostics.test.ts` |
| 31.7s | passed | `packages/core/test/fleetDataPlane.test.ts` |
| 29.7s | passed | `test/agentRunCostGate.test.ts` |
| 24.4s | passed | `packages/api/test/taskFollowupIssueQueueRecoveryHistory.test.ts` |
| 24.1s | passed | `test/agentRunReportNoveltyPrevious.test.ts` |
| 23.1s | passed | `packages/core/test/instanceStorage.test.ts` |
| 20.4s | passed | `test/agentRunNestedAdmission.test.ts` |
| 19.4s | passed | `packages/core/test/notificationService.test.ts` |
| 18.3s | passed | `packages/api/test/mcpDeletePlan.test.ts` |


1/267 test runs failed in shard 4/4 after 1086.1s:
- apps/desktop/src/rpm-maker.test.ts: exit 1

Details truncated; see the uploaded artifacts for complete failure rows and logs.

View Workflow
View uploaded artifacts

@github-actions

Copy link
Copy Markdown

Full Test Suite Results

Validation failed during: Test shard (shard 2), Test shard (shard 4).

  • Dependency install: success
  • Workspace build: success
  • Docs validation: success
  • Shard coverage verification: success
  • Hosted native Electron units: skipped (classifier decision: false)
  • Shard 1/4: passed in 1028.0s on GitHub Actions 1000118782
  • Shard 2/4: failed during Test shard in 1126.6s on GitHub Actions 1000118938
    • apps/desktop/scripts/rpm-signing.test.mjs: exit 1
  • Shard 3/4: passed in 844.7s on GitHub Actions 1000118779
  • Shard 4/4: failed during Test shard in 979.1s on GitHub Actions 1000118937
    • apps/desktop/src/rpm-maker.test.ts: exit 1
View shard 2/4 output
...(truncated)

: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

�[90mstderr�[2m | src/components/Repositories/RepoMediaPanel.test.tsx�[2m > �[22m�[2mrepository Media lightbox�[2m > �[22m�[2mplays a video inline in the dialog with its native controls
�[22m�[39mFailed to load indexed repositories: ProprClientError: The ProPR API could not be reached.
    at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:293:13)
    at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
    at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
    at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
  kind: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

�[90mstderr�[2m | src/components/Repositories/RepoMediaPanel.test.tsx�[2m > �[22m�[2mrepository Media lightbox�[2m > �[22m�[2mcloses on the close button and restores focus to the tile that opened it
�[22m�[39mFailed to load indexed repositories: ProprClientError: The ProPR API could not be reached.
    at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:293:13)
    at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
    at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
    at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
  kind: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

�[90mstderr�[2m | src/components/Repositories/RepoMediaPanel.test.tsx�[2m > �[22m�[2mrepository Media lightbox�[2m > �[22m�[2mcloses on the backdrop and restores focus to the tile that opened it
�[22m�[39mFailed to load indexed repositories: ProprClientError: The ProPR API could not be reached.
    at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:293:13)
    at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
    at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
    at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
  kind: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

�[90mstderr�[2m | src/components/Repositories/RepoMediaPanel.test.tsx�[2m > �[22m�[2mrepository Media lightbox�[2m > �[22m�[2mcloses on Escape and restores focus to the tile that opened it
�[22m�[39mFailed to load indexed repositories: ProprClientError: The ProPR API could not be reached.
    at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:293:13)
    at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
    at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
    at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
  kind: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

�[90mstderr�[2m | src/components/Repositories/RepoMediaPanel.test.tsx�[2m > �[22m�[2mrepository Media lightbox�[2m > �[22m�[2mnavigates the whole collection with controls and arrow keys, wrapping at both ends
�[22m�[39mFailed to load indexed repositories: ProprClientError: The ProPR API could not be reached.
    at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:293:13)
    at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
    at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
    at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
  kind: �[32m'network'�[39m,
  status: �[90mundefined�[39m,
  code: �[90mundefined�[39m,
  body: �[90mundefined�[39m,
  cause: TypeError: Failed to parse URL from /api/repositories/indexing-status
  �[90m    at node:internal/deps/undici/undici:15456:13�[39m
      at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:14)
      at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:34�[90m)�[39m
      at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:20�[90m)�[39m
      at loadIndexedRepositories �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/setupWizardHooks.ts:67:16�[90m)�[39m {
    [cause]: TypeError: Invalid URL
    �[90m    at new URL (node:internal/url:818:25)�[39m
        at new URL (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/index.CK-t0WMg.js:1415:2)
    �[90m    at new Request (node:internal/deps/undici/undici:10034:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:10763:25)�[39m
    �[90m    at fetch (node:internal/deps/undici/undici:15454:10)�[39m
    �[90m    at fetch (node:internal/bootstrap/web/exposed-window-or-worker:75:12)�[39m
        at ProprClient.fetchImplementation (/home/runner/work/propr/propr/packages/client/src/client.ts:244:78)
        at ProprClient.fetch (/home/runner/work/propr/propr/packages/client/src/client.ts:282:25)
        at apiFetch �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/apiClient.ts:414:54�[90m)�[39m
        at getRepositoriesIndexingStatus �[90m(/home/runner/work/propr/propr/propr-ui/�[39msrc/api/repoIndexingApi.ts:32:26�[90m)�[39m {
      code: �[32m'ERR_INVALID_URL'�[39m,
      input: �[32m'/api/repositories/indexing-status'�[39m
    }
  }
}

 �[32m✓�[39m src/components/Repositories/RepoMediaPanel.test.tsx �[2m(�[22m�[2m12 tests�[22m�[2m)�[22m�[33m 1410�[2mms�[22m�[39m
 �[32m✓�[39m src/App.hostedFlow.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 2286�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/electronAdapters.selectionFence.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 18�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/ReviewContextSettings.test.tsx �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[33m 350�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/demoViewer.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 533�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/useLiveRefreshScheduler.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 44�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/useHeaderStats.status.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 298�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/AddRepositoryModal.test.tsx�[2m > �[22m�[2mAddRepositoryModal�[2m > �[22m�[2mkeeps branch selection in the scroll-owned form and submits through one form path
�[22m�[39mIn HTML, <button> cannot be a descendant of <button>.
This will cause a hydration error.

  <AddRepositoryModal isOpen={true} newRepo="integry/propr" newAlias="Production" newBaseBranch="release/20..." ...>
    <div className="fixed inse..." onClick={function handleBackdropClick}>
      <div ref={{...}} role="dialog" aria-modal="true" aria-labelledby="_r_9_" tabIndex={-1} className="bg-white r...">
        <div>
        <form onSubmit={function handleSubmit} className="flex min-h...">
          <div data-testid="add-reposi..." className="min-h-0 fl...">
            <div>
            <div>
            <div>
              <label>
              <BaseBranchSelector repoName="integry/propr" value="release/20..." onChange={function Mock} ...>
                <div className="relative" ref={{...}}>
>                 <button
>                   id="_r_d_"
>                   type="button"
>                   onClick={function handleOpen}
>                   disabled={false}
>                   aria-labelledby="_r_e_ _r_h_"
>                   aria-describedby="_r_f_"
>                   aria-haspopup="listbox"
>                   aria-expanded={false}
>                   className="w-full px-3 py-2 text-left bg-white border border-gray-300 rounded-md font-mono text-sm..."
>                 >
                    <span>
                    <div className="flex items...">
>                     <button
>                       type="button"
>                       onClick={function handleClear}
>                       className="p-0.5 hover:bg-gray-200 rounded text-gray-400 hover:text-gray-600"
>                       title="Clear selection"
>                     >
                      ...
              ...
            ...
          ...

<button> cannot contain a nested <button>.
See this log for the ancestor stack trace.

 �[32m✓�[39m src/components/AddRepositoryModal.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 558�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/SetupWizardHeaders.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 315�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/VisualPreviewAuthSection.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 455�[2mms�[22m�[39m
 �[32m✓�[39m src/components/SystemHealthPush.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 458�[2mms�[22m�[39m
 �[32m✓�[39m src/components/SummaryBrowser/index.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 175�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/extensions/ExtensionOAuthServerName.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 446�[2mms�[22m�[39m
   �[32m✓�[39m OAuth actions for server names that match inherited object properties �[2m(2)�[22m
     �[33m�[2m✓�[22m�[39m starts a sign-in for an unconnected server named constructor and re-enables Connect afterwards�[33m 317�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/Agents/AgentEditor.templates.test.tsx�[2m > �[22m�[2mAgentEditor templates�[2m > �[22m�[2mopens prefilled from the template named in the link
�[22m�[39mAn update to AgentScopeSection inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentEditor inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentEditor inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/components/Agents/AgentEditor.templates.test.tsx�[2m > �[22m�[2mAgentEditor templates�[2m > �[22m�[2mopens an empty form for an unknown template
�[22m�[39mAn update to AgentScopeSection inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentEditor inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentEditor inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/components/Agents/AgentEditor.templates.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 998�[2mms�[22m�[39m
   �[32m✓�[39m AgentEditor templates �[2m(5)�[22m
     �[33m�[2m✓�[22m�[39m prefills the form from a chosen template and creates nothing until the user saves�[33m 733�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/PlanEditorHeader.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 399�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/AiAgentsPlaygroundSession.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 875�[2mms�[22m�[39m
   �[32m✓�[39m AiAgentsPage Playground session �[2m(3)�[22m
     �[33m�[2m✓�[22m�[39m shows one unsent draft in both layouts and keeps it across mobile tabs�[33m 461�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m delivers a response that arrives while the mobile Playground is hidden exactly once�[33m 316�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/DesktopWindowControls.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 266�[2mms�[22m�[39m
 �[32m✓�[39m src/components/GlobalHeader.nativeCreation.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 413�[2mms�[22m�[39m
   �[32m✓�[39m GlobalHeader native creation commands �[2m(4)�[22m
     �[33m�[2m✓�[22m�[39m opens the toolbar quick add for New To-do without creating anything, and cancels cleanly�[33m 314�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Analytics/activityAxis.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 51�[2mms�[22m�[39m
 �[32m✓�[39m src/api/extensionSelectionHeaders.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 26�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Goals/goalTimeline.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/WorkflowSettingsSection.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 408�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/TaskPlanner/usePlanQueueActions.test.ts�[2m > �[22m�[2mPlanner Studio queue actions�[2m > �[22m�[2ma refused action surfaces its error and rereads the queue
�[22m�[39mFailed to skip issue #1: Error: Issue #1 is in flight; wait for its run to finish or block.
    at �[90m/home/runner/work/propr/propr/propr-ui/�[39msrc/components/TaskPlanner/usePlanQueueActions.test.ts:52:32
    at file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:1632:35
    at file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:2801:26
    at file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:3338:20
    at new Promise (<anonymous>)
    at runWithCancel (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:3333:10)
    at file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:3318:20
    at new Promise (<anonymous>)
    at runWithTimeout (file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:3276:10)
    at file:///home/runner/work/propr/propr/node_modules/�[4mvitest�[24m/dist/chunks/run.BPv-BBRv.js:3904:64

 �[32m✓�[39m src/components/TaskPlanner/usePlanQueueActions.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 43�[2mms�[22m�[39m
 �[32m✓�[39m src/api/triggerWhitelistApi.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 23�[2mms�[22m�[39m
 �[32m✓�[39m src/components/AgentChat/ModelSelector.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 548�[2mms�[22m�[39m
   �[32m✓�[39m ModelSelector keyboard navigation �[2m(4)�[22m
     �[33m�[2m✓�[22m�[39m scrolls to and selects an active option beyond the initial viewport�[33m 376�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/McpServerSection.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 286�[2mms�[22m�[39m
 �[32m✓�[39m src/api/apiClient.accounts.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 20�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/DesktopExperience.shortcut-readiness.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 265�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Agents/AgentEditor.deleteWhileSaving.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 487�[2mms�[22m�[39m
   �[32m✓�[39m AgentEditor deletion while saving �[2m(2)�[22m
     �[33m�[2m✓�[22m�[39m disables Delete while a save is pending�[33m 427�[2mms�[22m�[39m
 �[32m✓�[39m src/api/compatibility.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 699�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/PlanEditor.responsive.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 60�[2mms�[22m�[39m
 �[32m✓�[39m src/App.hostedCompletion.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 233�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/browserAdapters.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 26�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/PlansPageUtils.test.tsx �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 8�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/PushFailureDetails.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 283�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/LoginPage.authError.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 367�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SummaryBrowserPage.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 85�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Dashboard/workTitle.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 8�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Analytics/activityPairs.test.ts �[2m(�[22m�[2m23 tests�[22m�[2m)�[22m�[32m 15�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/DesktopPresentationBoundary.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 226�[2mms�[22m�[39m
 �[32m✓�[39m src/components/ActivitySparkline.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 199�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/ThinkingLog.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 237�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/AgentTankSection.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 245�[2mms�[22m�[39m
 �[32m✓�[39m src/api/usageTipsApi.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/components/GlobalSearch.scrollbar.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/contexts/SystemStatusContext.push.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 29�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/useAnchoredPopover.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/utils/modalBackground.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 41�[2mms�[22m�[39m
 �[32m✓�[39m src/components/RepositoryListItem.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 206�[2mms�[22m�[39m
�[90mstderr�[2m | src/hooks/useDecoratedRepoOptions.test.tsx�[2m > �[22m�[2museDecoratedRepoOptions�[2m > �[22m�[2mpasses through undefined options
�[22m�[39mAn update to TestComponent inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/hooks/useDecoratedRepoOptions.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 74�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/useAgentTankSuggestion.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 79�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/SectionLabelHeader.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 238�[2mms�[22m�[39m
 �[32m✓�[39m src/components/workflowSelectionInput.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/useInboxSelection.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 27�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/PlansPageComponents.owner.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 76�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/UsageTipsSettingsSection.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 67�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/settingsCategoryGuides.test.ts �[2m(�[22m�[2m21 tests�[22m�[2m)�[22m�[32m 14�[2mms�[22m�[39m
 �[32m✓�[39m src/utils/notificationIntents.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m88 passed�[39m�[22m�[90m (88)�[39m
�[2m      Tests �[22m �[1m�[32m817 passed�[39m�[22m�[90m (817)�[39m
�[2m   Start at �[22m 10:01:17
�[2m   Duration �[22m 95.36s�[2m (environment 39%, tests 33%, import 15%, setup 8%, transform 4%)�[22m

�[2mEnvironment �[22m �[33mjsdom was created 88 times�[39m�[2m · 70.44s total, 39% of tracked time�[22m
�[2m            �[22m �[2mcreate it once per worker with �[22m�[33mpool: 'vmThreads'�[39m�[2m (keeps per-file isolation) or �[22m�[33misolate: false�[39m�[2m (shares it across files)�[22m
�[2m            �[22m �[2mlearn more: https://vitest.dev/guide/improving-performance#test-environments�[22m


> propr-ui@0.0.1 posttest
> npm run test:docker-context


> propr-ui@0.0.1 test:docker-context
> node --test scripts/docker-context-inputs.test.mjs

TAP version 13
# Subtest: focused UI selectors are forwarded only to Vitest
ok 1 - focused UI selectors are forwarded only to Vitest
  ---
  duration_ms: 0.936342
  type: 'test'
  ...
# Subtest: the UI Docker context contains its complete non-type external source import closure
ok 2 - the UI Docker context contains its complete non-type external source import closure
  ---
  duration_ms: 72.945343
  type: 'test'
  ...
1..2
# tests 2
# suites 0
# pass 2
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 135.250514
[268/268] passed propr-ui#3/4 (workspace test script) in 96.2s

### Shard 2/4: 267/268 passed in 1126.6s

Assigned 268 of 1071 discovered units.

| Duration | Status | Unit |
| ---: | --- | --- |
| 96.2s | passed | `propr-ui#3/4` (workspace) |
| 62.7s | passed | `test/routingDeliveryInterest.test.ts` |
| 45.0s | passed | `test/agentRunUnproductiveStreakRecovery.test.ts` |
| 33.2s | passed | `test/agentRunProductivity.test.ts` |
| 30.8s | passed | `test/agentAutonomy.test.ts` |
| 30.7s | passed | `packages/api/test/mcpBrowser.test.ts` |
| 29.4s | passed | `apps/desktop/scripts/desktop-native-menu.test.mjs` |
| 28.7s | passed | `apps/desktop/scripts/signing-key-verification.test.mjs` |
| 25.4s | passed | `test/agentRunStore.test.ts` |
| 22.3s | passed | `test/connectCliIntegration.test.ts` |
| 20.7s | passed | `test/daemon.test.ts` |
| 17.7s | passed | `packages/api/test/goalBlockerNotifications.test.ts` |
| 16.0s | passed | `packages/core/test/executeDraftDependencies.test.ts` |
| 15.1s | failed | `apps/desktop/scripts/rpm-signing.test.mjs` |
| 15.0s | passed | `packages/core/test/nativeLogAdmission.test.ts` |


1/268 test runs failed in shard 2/4 after 1126.6s:
- apps/desktop/scripts/rpm-signing.test.mjs: exit 1

View shard 4/4 output
...(truncated)

er leaves a pending fresh plan�[2m > �[22m�[2mkeeps another opened draft untouched when the acknowledgement arrives
�[22m�[39mFailed to save planner settings to localStorage

 �[32m✓�[39m src/components/TaskDetails/useTaskAssignment.test.tsx �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[33m 707�[2mms�[22m�[39m
�[90mstdout�[2m | src/pages/PlanStudioPage.freshGenerate.test.tsx�[2m > �[22m�[2mfresh plan generation becomes the displayed draft (desktop=true)�[2m > �[22m�[2mafter the user leaves a pending fresh plan�[2m > �[22m�[2mkeeps another opened draft untouched when the acknowledgement arrives
�[22m�[39m[useDraft] Received draft update via WebSocket: {
  draftId: �[32m'draft-1'�[39m,
  timestamp: �[32m'2026-11-14T09:59:40.170Z'�[39m,
  runId: �[32m'run-1'�[39m,
  draftStatus: �[32m'review'�[39m
}

�[90mstderr�[2m | src/pages/PlanStudioPage.freshGenerate.test.tsx�[2m > �[22m�[2mfresh plan generation becomes the displayed draft (desktop=true)�[2m > �[22m�[2mafter the user leaves a pending fresh plan�[2m > �[22m�[2mkeeps another opened draft untouched when the acknowledgement arrives
�[22m�[39mAn update to PlanStudioPage inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to PlanStudioPage inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/PlanStudioPage.freshGenerate.test.tsx�[2m > �[22m�[2mfresh plan generation becomes the displayed draft (desktop=true)�[2m > �[22m�[2mafter the user leaves a pending fresh plan�[2m > �[22m�[2mdoes not rewrite the plans entry when the draft is created after Back
�[22m�[39mFailed to save planner settings to localStorage

�[90mstderr�[2m | src/pages/PlanStudioPage.freshGenerate.test.tsx�[2m > �[22m�[2mfresh plan generation becomes the displayed draft (desktop=true)�[2m > �[22m�[2mafter the user leaves a pending fresh plan�[2m > �[22m�[2mdoes not rewrite the plans entry when the draft is created after Back
�[22m�[39mFailed to save planner settings to localStorage

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2mpreserves distinct migrated effort labels when editing and saving an Antigravity agent
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2madds a loginable agent with an isolated managed credential path and requests login
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2mallows a new agent to reuse an existing config directory instead of logging in
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2muses the agent alias in long model labels
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2msaves a model-specific reasoning level for Codex agents
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2mAgentConfigModal�[2m > �[22m�[2mmarks a legacy cross-agent reasoning value as unsupported
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/pages/SettingsPage/AgentConfigModal.test.tsx�[2m > �[22m�[2moffers one Antigravity entry per model with model-specific reasoning choices
�[22m�[39mAn update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to AgentConfigModal inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/pages/SettingsPage/AgentConfigModal.test.tsx �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[33m 934�[2mms�[22m�[39m
�[90mstdout�[2m | src/pages/PlanStudioPage.freshGenerate.test.tsx�[2m > �[22m�[2mfresh plan generation becomes the displayed draft (desktop=true)�[2m > �[22m�[2mafter the user leaves a pending fresh plan�[2m > �[22m�[2mdoes not rewrite the plans entry when the draft is created after Back
�[22m�[39m[useDraft] Received draft update via WebSocket: {
  draftId: �[32m'draft-1'�[39m,
  timestamp: �[32m'2026-11-14T09:59:41.593Z'�[39m,
  runId: �[32m'run-1'�[39m,
  draftStatus: �[32m'review'�[39m
}

�[90mstderr�[2m | src/pages/PlanStudioPage.freshGenerate.test.tsx�[2m > �[22m�[2mfresh plan generation becomes the displayed draft (desktop=true)�[2m > �[22m�[2mafter the user leaves a pending fresh plan�[2m > �[22m�[2mdoes not rewrite the plans entry when the draft is created after Back
�[22m�[39mAn update to PlanStudioPage inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act
An update to PlanStudioPage inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/pages/PlanStudioPage.freshGenerate.test.tsx �[2m(�[22m�[2m14 tests�[22m�[2m)�[22m�[33m 17918�[2mms�[22m�[39m
   �[32m✓�[39m fresh plan generation becomes the displayed draft (desktop=false) �[2m(7)�[22m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate races the autosave debounce (stale read before the acknowledgement)�[33m 1708�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate races the autosave debounce (stale read after the acknowledgement)�[33m 1510�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate follows an in-place autosave�[33m 1504�[2mms�[22m�[39m
     �[32m✓�[39m after the user leaves a pending fresh plan �[2m(3)�[22m
       �[33m�[2m✓�[22m�[39m keeps the plans list when the acknowledgement arrives after Back�[33m 1435�[2mms�[22m�[39m
       �[33m�[2m✓�[22m�[39m keeps another opened draft untouched when the acknowledgement arrives�[33m 1515�[2mms�[22m�[39m
       �[33m�[2m✓�[22m�[39m does not rewrite the plans entry when the draft is created after Back�[33m 1434�[2mms�[22m�[39m
   �[32m✓�[39m fresh plan generation becomes the displayed draft (desktop=true) �[2m(7)�[22m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate races the autosave debounce (stale read before the acknowledgement)�[33m 1437�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate races the autosave debounce (stale read after the acknowledgement)�[33m 1443�[2mms�[22m�[39m
     �[33m�[2m✓�[22m�[39m shows Generating then Review when Generate follows an in-place autosave�[33m 1454�[2mms�[22m�[39m
     �[32m✓�[39m after the user leaves a pending fresh plan �[2m(3)�[22m
       �[33m�[2m✓�[22m�[39m keeps the plans list when the acknowledgement arrives after Back�[33m 1404�[2mms�[22m�[39m
       �[33m�[2m✓�[22m�[39m keeps another opened draft untouched when the acknowledgement arrives�[33m 1431�[2mms�[22m�[39m
       �[33m�[2m✓�[22m�[39m does not rewrite the plans entry when the draft is created after Back�[33m 1422�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/ContextStrip.test.tsx �[2m(�[22m�[2m17 tests�[22m�[2m)�[22m�[33m 464�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/TaskVisualPreviews.test.tsx �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[33m 455�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/LogFilesModal.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 496�[2mms�[22m�[39m
   �[32m✓�[39m LogFilesModal �[2m(3)�[22m
     �[33m�[2m✓�[22m�[39m searches literal metacharacters, counts what it highlights, and steps through matches�[33m 362�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/TaskDetails/ReviewScoreHistory.test.tsx�[2m > �[22m�[2musePullRequestScores�[2m > �[22m�[2mnever returns a previous PR's history for a new PR, while loading or after a failed read
�[22m�[39mAn update to TestComponent inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/components/TaskDetails/ReviewScoreHistory.test.tsx �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 299�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/TaskDetails/LatestRunCommands.projection.test.tsx�[2m > �[22m�[2mfollow-up commands read from the API task projection�[2m > �[22m�[2mthe task header keeps /fix for findings and sends it only after the projection is read again
�[22m�[39mAn update to FollowupCommands inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/components/TaskDetails/LatestRunCommands.projection.test.tsx �[2m(�[22m�[2m13 tests�[22m�[2m)�[22m�[32m 209�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/PlanStudioPage.inPlaceDraft.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 207�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/index.followupTarget.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 481�[2mms�[22m�[39m
 �[32m✓�[39m src/components/ApplicationShell.idle.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 60�[2mms�[22m�[39m
 �[32m✓�[39m src/components/ui/Skeleton.test.tsx �[2m(�[22m�[2m12 tests�[22m�[2m)�[22m�[32m 215�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop-deep-link.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/AgentRuntimePackagesSection.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 652�[2mms�[22m�[39m
   �[32m✓�[39m AgentRuntimePackagesSection �[2m(7)�[22m
     �[33m�[2m✓�[22m�[39m offers catalog suggestions and validates a selected package�[33m 335�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Goals/GoalAttentionPanel.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 303�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/NotificationSettingsSection.test.tsx �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[33m 901�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/FollowupModal.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 347�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/AgentNetworkSettingsSection.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 297�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/planDisplayName.test.ts �[2m(�[22m�[2m17 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
 �[32m✓�[39m src/api/currentUserResponse.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
�[90mstdout�[2m | src/components/TaskDetails/LiveFileChips.test.tsx�[2m > �[22m�[2mLiveFileChips live refreshes�[2m > �[22m�[2mturns the fixture baseline of three burst invalidations into one additional file-changes request
�[22m�[39m[LiveFileChips] Received task update, refreshing file changes: { taskId: �[32m'task-1'�[39m }
[LiveFileChips] Received task update, refreshing file changes: { taskId: �[32m'task-1'�[39m }
[LiveFileChips] Received task update, refreshing file changes: { taskId: �[32m'task-1'�[39m }

 �[32m✓�[39m src/components/TaskDetails/LiveFileChips.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 342�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/PlanIssuesManager.notificationIntent.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 552�[2mms�[22m�[39m
   �[32m✓�[39m PlanIssuesManager execution intent �[2m(3)�[22m
     �[33m�[2m✓�[22m�[39m cancel closes without starting implementation�[33m 348�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskList/hooks.lazyRoute.test.tsx �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[33m 331�[2mms�[22m�[39m
 �[32m✓�[39m src/components/globalSearchModel.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 8�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/PlanEditor.notificationIntent.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[33m 517�[2mms�[22m�[39m
   �[32m✓�[39m PlanEditor notification intents �[2m(4)�[22m
     �[33m�[2m✓�[22m�[39m never approves from navigation and cancel leaves the plan unchanged�[33m 476�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/useCurrentUserBootstrap.mainProxy.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 84�[2mms�[22m�[39m
 �[32m✓�[39m src/components/RepositoryAutoAssignControl.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 247�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/packagedAcceptanceRendererLifecycle.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/TaskCard.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[33m 458�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/planIssueDefaultSelection.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/AgentWatchdogSettingsSection.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 88�[2mms�[22m�[39m
�[90mstdout�[2m | src/components/TaskDetails/useTaskData.completion.test.ts�[2m > �[22m�[2mreplaces the live view of a subscribed client with persisted details when the task completes
�[22m�[39m[useTaskData] Received task update via WebSocket: { taskId: �[32m'task'�[39m, state: �[32m'COMPLETED'�[39m }

 �[32m✓�[39m src/components/TaskDetails/useTaskData.completion.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 21�[2mms�[22m�[39m
 �[32m✓�[39m src/api/dashboardApi.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/SettingsPage/VoiceSettingsSection.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 271�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/DesktopExperience.accounts.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 332�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Agents/AgentEditor.eventTrigger.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 69�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/generationTelemetryUtils.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
 �[32m✓�[39m src/components/UserAvatar.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 160�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/PromptModal.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 202�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/setupWizardHooks.editMode.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 18�[2mms�[22m�[39m
�[90mstderr�[2m | src/components/RepositoryAutoResolveConflictsControl.test.tsx�[2m > �[22m�[2mRepositoryAutoResolveConflictsControl�[2m > �[22m�[2mreflects a stored override
�[22m�[39mAn update to RepositoryAutoResolveConflictsControl inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

�[90mstderr�[2m | src/components/RepositoryAutoResolveConflictsControl.test.tsx�[2m > �[22m�[2mRepositoryAutoResolveConflictsControl�[2m > �[22m�[2msets always, never, and inherit (null)
�[22m�[39mAn update to RepositoryAutoResolveConflictsControl inside a test was not wrapped in act(...).

When testing, code that causes React state updates should be wrapped into act(...):

act(() => {
  /* fire events that update state */
});
/* assert on the output */

This ensures that you're testing the behavior the user would see in the browser. Learn more at https://react.dev/link/wrap-tests-with-act

 �[32m✓�[39m src/components/RepositoryAutoResolveConflictsControl.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 213�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/ContextLevelSlider.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 51�[2mms�[22m�[39m
 �[32m✓�[39m src/components/modalShells.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 195�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskList/durations.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
 �[32m✓�[39m src/components/RouteChunkErrorBoundary.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 196�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/PlanEditorDesktopLayout.assistant.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 221�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/useSelectedModelMaxTokens.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 70�[2mms�[22m�[39m
 �[32m✓�[39m src/desktop/scopedTaskEvents.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/setupWizardDraftConfig.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskList/Pagination.test.tsx �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 170�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/TaskCardList.breakpoint.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 193�[2mms�[22m�[39m
 �[32m✓�[39m src/hooks/repositoryNonBlockingChecks.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
 �[32m✓�[39m src/api/automationRunTrigger.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Agents/AgentAutonomySection.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 209�[2mms�[22m�[39m
 �[32m✓�[39m src/pages/InboxPageComponents.test.tsx �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 150�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/syntaxHighlighter.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 13�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/taskKind.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/AssignmentControl.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 161�[2mms�[22m�[39m
 �[32m✓�[39m src/api/proprApi.instanceCatalog.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 8�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/executionConfigSummary.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Dashboard/KPICard.test.tsx �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 33�[2mms�[22m�[39m
 �[32m✓�[39m src/components/Repositories/RepoBrowsePanel.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 22�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/RefinementChat.focus.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 151�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskDetails/ExecutionEventUtils.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
 �[32m✓�[39m src/components/TaskPlanner/tokenFormat.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 3�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[32m88 passed�[39m�[22m�[90m (88)�[39m
�[2m      Tests �[22m �[1m�[32m756 passed�[39m�[22m�[90m (756)�[39m
�[2m   Start at �[22m 09:59:01
�[2m   Duration �[22m 79.17s�[2m (tests 39%, environment 35%, import 14%, setup 7%, transform 5%)�[22m

�[2mEnvironment �[22m �[33mjsdom was created 88 times�[39m�[2m · 53.06s total, 35% of tracked time�[22m
�[2m            �[22m �[2mcreate it once per worker with �[22m�[33mpool: 'vmThreads'�[39m�[2m (keeps per-file isolation) or �[22m�[33misolate: false�[39m�[2m (shares it across files)�[22m
�[2m            �[22m �[2mlearn more: https://vitest.dev/guide/improving-performance#test-environments�[22m


> propr-ui@0.0.1 posttest
> npm run test:docker-context


> propr-ui@0.0.1 test:docker-context
> node --test scripts/docker-context-inputs.test.mjs

TAP version 13
# Subtest: focused UI selectors are forwarded only to Vitest
ok 1 - focused UI selectors are forwarded only to Vitest
  ---
  duration_ms: 0.696028
  type: 'test'
  ...
# Subtest: the UI Docker context contains its complete non-type external source import closure
ok 2 - the UI Docker context contains its complete non-type external source import closure
  ---
  duration_ms: 53.265207
  type: 'test'
  ...
1..2
# tests 2
# suites 0
# pass 2
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 99.797471
[267/267] passed propr-ui#1/4 (workspace test script) in 79.8s

### Shard 4/4: 266/267 passed in 979.1s

Assigned 267 of 1071 discovered units.

| Duration | Status | Unit |
| ---: | --- | --- |
| 79.8s | passed | `propr-ui#1/4` (workspace) |
| 63.6s | passed | `packages/api/test/mcpAccessLog.test.ts` |
| 63.3s | passed | `packages/api/test/mcpAgentRuns.test.ts` |
| 38.9s | passed | `apps/desktop/src/profile-store.crash-recovery.test.ts` |
| 34.9s | passed | `packages/core/test/managedDiagnostics.test.ts` |
| 29.5s | passed | `packages/core/test/fleetDataPlane.test.ts` |
| 29.1s | passed | `packages/api/test/mcpPublishPlan.test.ts` |
| 28.1s | passed | `packages/api/test/planRevisions.test.ts` |
| 24.0s | passed | `packages/core/test/instanceStorage.test.ts` |
| 23.5s | passed | `packages/api/test/taskFollowupIssueQueueRecoveryHistory.test.ts` |
| 22.5s | passed | `test/agentRunCostGate.test.ts` |
| 18.6s | passed | `test/agentRunNestedAdmission.test.ts` |
| 17.1s | passed | `test/agentRunReportNoveltyPrevious.test.ts` |
| 15.3s | passed | `packages/core/test/notificationService.test.ts` |
| 13.1s | passed | `packages/api/test/mcpDeletePlan.test.ts` |


1/267 test runs failed in shard 4/4 after 979.1s:
- apps/desktop/src/rpm-maker.test.ts: exit 1

Details truncated; see the uploaded artifacts for complete failure rows and logs.

View Workflow
View uploaded artifacts

@integry

integry commented Nov 14, 2026

Copy link
Copy Markdown
Owner Author

/merge

@integry
integry merged commit 04a7f38 into main Nov 14, 2026
44 checks passed
@integry
integry deleted the ci/faster-validate branch November 14, 2026 11:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants