From 8540ce2973204a8938cd05ac18fbc37c6434f8f5 Mon Sep 17 00:00:00 2001 From: Devin Foley Date: Sat, 1 Aug 2026 19:03:28 -0700 Subject: [PATCH] ci: shard general-server tests 4 ways (#10663) ## Thinking Path > - Paperclip is the open source app people use to manage AI agents for work. > - Pull request CI must give contributors fast and stable feedback. > - The `general-server` Vitest lane runs many single-worker server suites. > - A recent completed PR run showed this lane as the slowest completed check. > - Three shards still left one runner with the largest share of work. > - This pull request splits that lane into four duration-balanced shards. > - The benefit is a shorter critical path for the same server test coverage. ## Linked Issues or Issue Description No public GitHub issue exists for this CI maintenance change. **Pre-submission checklist** - I confirmed this improves existing behavior. It does not add a new command, endpoint, or concept. - I searched open public issues and pull requests for related CI sharding work. **What existing behavior does this improve?** The pull request workflow's `general-server` Vitest lane. **Subsystem affected** Cross-cutting. This affects GitHub Actions CI and the Vitest shard duration manifest. **Current behavior** The `general-server` lane uses three shards. The server suites now total about 880 seconds of serial Vitest wall time. The slowest shard was about 313 seconds in the measured run. **Proposed behavior** The `general-server` lane uses four shards. Each shard receives about 220 seconds of predicted suite weight from the refreshed duration manifest. **Reason and benefit** The slowest PR check controls how soon a reviewer can trust the PR. Four balanced shards reduce the slowest `general-server` shard while keeping the same suite selection rules. **Breaking changes** None. This only changes CI partitioning and duration data for existing test suites. **Additional context** Related public searches found no exact open issue or pull request for this `general-server` sharding change. ## What Changed - Split the `general-server` CI matrix from three shards to four shards. - Refreshed `scripts/general-server-shard-durations.json` with wall-time weights from a recent completed PR run. ## Verification - `node --test scripts/__tests__/run-vitest-stable-shard.test.mjs` - `git diff --check origin/master...HEAD` - Dry-ran the four `general-server` shards locally during implementation. The partition covers 300 unique suites with about 220.56 seconds of predicted weight per shard. - Ran a local sensitive-data scan before push. It found only test filenames that contain words such as `secret` or `token`, not credential values. ## Risks Low risk. The main risk is that the duration manifest becomes stale as suite costs move. Missing suites fall back to the median weight, so the lane still runs if the manifest is incomplete. ## Model Used OpenAI Codex, GPT-5, with tool use and local command execution. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have searched GitHub for duplicate or related PRs and linked them above - [x] I have either (a) linked existing issues with `Fixes: #` / `Closes #` / `Refs #` OR (b) described the issue in-PR following the relevant issue template - [x] I have not referenced internal/instance-local Paperclip issues or links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip` URLs) - [x] My branch name describes the change (e.g. `docs/...`, `fix/...`) and contains no internal Paperclip ticket id or instance-derived details - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] All Paperclip CI gates are green - [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip --- .github/workflows/pr.yml | 21 +- .../run-vitest-stable-shard.test.mjs | 2 +- scripts/general-server-shard-durations.json | 544 ++++++++++-------- 3 files changed, 317 insertions(+), 250 deletions(-) diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index df7b76c871..5c9f483db5 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -149,19 +149,26 @@ jobs: include: # The server suite is pinned to maxWorkers=1 (server/vitest.config.ts), # so it can only be parallelized across runners. Shard it to keep this - # lane off the PR critical path. + # lane off the PR critical path. Four shards because the suite has + # grown to ~880s of serial vitest wall time (run 30723165356, + # 2026-08-01): at three shards the worst shard ran 313s and was the + # slowest check in the whole PR run; four brings each shard to ~220s. - group: general-server - group_label: server (1/3) + group_label: server (1/4) shard_index: 0 - shard_count: 3 + shard_count: 4 - group: general-server - group_label: server (2/3) + group_label: server (2/4) shard_index: 1 - shard_count: 3 + shard_count: 4 - group: general-server - group_label: server (3/3) + group_label: server (3/4) shard_index: 2 - shard_count: 3 + shard_count: 4 + - group: general-server + group_label: server (4/4) + shard_index: 3 + shard_count: 4 - group: general-workspaces-a group_label: workspaces-a - group: general-workspaces-b diff --git a/scripts/__tests__/run-vitest-stable-shard.test.mjs b/scripts/__tests__/run-vitest-stable-shard.test.mjs index 7d0da8ea99..9b69130527 100644 --- a/scripts/__tests__/run-vitest-stable-shard.test.mjs +++ b/scripts/__tests__/run-vitest-stable-shard.test.mjs @@ -28,7 +28,7 @@ function dryRunJson(args) { return JSON.parse(result.stdout); } -const SHARD_COUNT = 3; +const SHARD_COUNT = 4; test("the general-server shards form a complete, non-overlapping partition", () => { const shards = Array.from({ length: SHARD_COUNT }, (_, index) => diff --git a/scripts/general-server-shard-durations.json b/scripts/general-server-shard-durations.json index 8b73e9318c..91f8729883 100644 --- a/scripts/general-server-shard-durations.json +++ b/scripts/general-server-shard-durations.json @@ -1,246 +1,306 @@ { - "$comment": "Per-suite wall-clock durations (ms) for the general-server vitest lane, used by scripts/general-server-shard.mjs to balance suites across the PR shard matrix. Sampled from a real PR run of .github/workflows/pr.yml (actions run 29262068391, 2026-07-13). Suites missing here get the median weight, so the manifest only needs occasional refreshes: pull the 'Run grouped general test suites' logs from a recent PR run and record each suite's vitest-reported duration.", + "$comment": "Per-suite wall-clock durations (ms) for the general-server vitest lane, used by scripts/general-server-shard.mjs to balance suites across the PR shard matrix. Sampled from a real PR run of .github/workflows/pr.yml (actions run 30723165356, 2026-08-01) by diffing consecutive per-suite completion timestamps in the 'Run grouped general test suites' logs \u2014 that captures each suite's true serial cost (import + collect + tests), not just the vitest-reported test time. Suites missing here get the median weight, so the manifest only needs occasional refreshes.", "unit": "ms", "durations": { - "server/src/__tests__/access-service.test.ts": 2303, - "server/src/__tests__/access-validators.test.ts": 7, - "server/src/__tests__/activity-service.test.ts": 2390, - "server/src/__tests__/adapter-models.test.ts": 61, - "server/src/__tests__/adapter-registry.test.ts": 17, - "server/src/__tests__/adapter-session-codecs.test.ts": 10, - "server/src/__tests__/agent-auth-jwt.test.ts": 20, - "server/src/__tests__/agent-auth-middleware.test.ts": 66, - "server/src/__tests__/agent-instructions-service.test.ts": 58, - "server/src/__tests__/agent-invokability.test.ts": 5, - "server/src/__tests__/agent-permissions-service.test.ts": 6, - "server/src/__tests__/agent-shortname-collision.test.ts": 5, - "server/src/__tests__/agent-skill-contract.test.ts": 6, - "server/src/__tests__/agents-pending-approval-config.test.ts": 2182, - "server/src/__tests__/agents-service-clear-error.test.ts": 2258, - "server/src/__tests__/agents-service-secret-bindings.test.ts": 2367, - "server/src/__tests__/api-compression.test.ts": 77, - "server/src/__tests__/app-hmr-port.test.ts": 4, - "server/src/__tests__/app-private-hostname-gate.test.ts": 4, - "server/src/__tests__/app-vite-dev-routing.test.ts": 4, - "server/src/__tests__/approvals-service.test.ts": 12, - "server/src/__tests__/attachment-types.test.ts": 9, - "server/src/__tests__/attention-service.test.ts": 2626, - "server/src/__tests__/authorization-service.test.ts": 2824, - "server/src/__tests__/aws-secrets-manager-provider.test.ts": 39, - "server/src/__tests__/better-auth.test.ts": 9, - "server/src/__tests__/board-claim.test.ts": 2121, - "server/src/__tests__/board-mutation-guard.test.ts": 50, - "server/src/__tests__/body-limits.test.ts": 3, - "server/src/__tests__/budgets-service.test.ts": 2211, - "server/src/__tests__/built-in-agents.test.ts": 6157, - "server/src/__tests__/change-consent-gate.test.ts": 2256, - "server/src/__tests__/claude-local-adapter-environment.test.ts": 372, - "server/src/__tests__/claude-local-adapter.test.ts": 8, - "server/src/__tests__/claude-local-execute.test.ts": 2771, - "server/src/__tests__/claude-local-skill-sync.test.ts": 21, - "server/src/__tests__/cleanup-removal-service.test.ts": 2248, - "server/src/__tests__/cloud-upstreams.test.ts": 2576, - "server/src/__tests__/codex-auth-reconciliation.test.ts": 46, - "server/src/__tests__/codex-local-adapter.test.ts": 9, - "server/src/__tests__/codex-local-execute.test.ts": 974, - "server/src/__tests__/codex-local-skill-injection.test.ts": 29, - "server/src/__tests__/codex-local-skill-sync.test.ts": 18, - "server/src/__tests__/companies-service.test.ts": 3104, - "server/src/__tests__/company-artifacts-service.test.ts": 2531, - "server/src/__tests__/company-search-service.test.ts": 3127, - "server/src/__tests__/company-skill-test-runs-service.test.ts": 3331, - "server/src/__tests__/company-skills-catalog-service.test.ts": 3584, - "server/src/__tests__/company-skills-detail.test.ts": 2258, - "server/src/__tests__/company-skills-service.test.ts": 5470, - "server/src/__tests__/company-skills.test.ts": 33, - "server/src/__tests__/cursor-local-adapter-environment.test.ts": 232, - "server/src/__tests__/cursor-local-adapter.test.ts": 11, - "server/src/__tests__/cursor-local-execute.test.ts": 1028, - "server/src/__tests__/cursor-local-skill-injection.test.ts": 15, - "server/src/__tests__/cursor-local-skill-sync.test.ts": 22, - "server/src/__tests__/dashboard-service.test.ts": 2222, - "server/src/__tests__/dev-runner-output.test.ts": 25, - "server/src/__tests__/dev-runner-paths.test.ts": 4, - "server/src/__tests__/dev-runner-snapshot.test.ts": 8, - "server/src/__tests__/dev-runner-worktree.test.ts": 7, - "server/src/__tests__/dev-server-status.test.ts": 7, - "server/src/__tests__/dev-watch-ignore.test.ts": 7, - "server/src/__tests__/docker-entrypoint.test.ts": 39, - "server/src/__tests__/document-annotations-service.test.ts": 2528, - "server/src/__tests__/documents-service.test.ts": 2253, - "server/src/__tests__/documents.test.ts": 4, - "server/src/__tests__/effective-run-config-fingerprints.test.ts": 10, - "server/src/__tests__/environment-config.test.ts": 11, - "server/src/__tests__/environment-custom-image-terminal-ws.test.ts": 2566, - "server/src/__tests__/environment-custom-images-service.test.ts": 3889, - "server/src/__tests__/environment-execution-target.test.ts": 7, - "server/src/__tests__/environment-live-ssh.test.ts": 717, - "server/src/__tests__/environment-probe.test.ts": 12, - "server/src/__tests__/environment-run-orchestrator.test.ts": 13, - "server/src/__tests__/environment-runtime-driver-contract.test.ts": 2723, - "server/src/__tests__/environment-runtime.test.ts": 3287, - "server/src/__tests__/environment-service.test.ts": 2266, - "server/src/__tests__/environment-test-harness.test.ts": 14, - "server/src/__tests__/error-handler.test.ts": 12, - "server/src/__tests__/execution-lock-orphan-cleanup.test.ts": 2333, - "server/src/__tests__/execution-workspace-policy.test.ts": 9, - "server/src/__tests__/execution-workspaces-service.test.ts": 6035, - "server/src/__tests__/external-objects-service.test.ts": 2282, - "server/src/__tests__/feedback-flush-controller.test.ts": 4, - "server/src/__tests__/feedback-service.test.ts": 2520, - "server/src/__tests__/feedback-share-client.test.ts": 9, - "server/src/__tests__/file-resources.test.ts": 4757, - "server/src/__tests__/first-admin-claim.test.ts": 2117, - "server/src/__tests__/forbidden-tokens.test.ts": 6, - "server/src/__tests__/gemini-local-adapter-environment.test.ts": 80, - "server/src/__tests__/gemini-local-adapter.test.ts": 9, - "server/src/__tests__/gemini-local-execute.test.ts": 220, - "server/src/__tests__/gemini-local-skill-sync.test.ts": 18, - "server/src/__tests__/grok-local-skill-sync.test.ts": 15, - "server/src/__tests__/heartbeat-accepted-plan-workspace-refresh.test.ts": 5034, - "server/src/__tests__/heartbeat-active-run-output-watchdog.test.ts": 49231, - "server/src/__tests__/heartbeat-archived-company-guard.test.ts": 2303, - "server/src/__tests__/heartbeat-auto-checkout.test.ts": 5, - "server/src/__tests__/heartbeat-comment-wake-batching.test.ts": 5030, - "server/src/__tests__/heartbeat-context-summary.test.ts": 8, - "server/src/__tests__/heartbeat-issue-rewake-throttle.test.ts": 3198, - "server/src/__tests__/heartbeat-list.test.ts": 2240, - "server/src/__tests__/heartbeat-local-environment.test.ts": 2504, - "server/src/__tests__/heartbeat-lock-release-on-reassignment.test.ts": 2129, - "server/src/__tests__/heartbeat-model-profile.test.ts": 6, - "server/src/__tests__/heartbeat-plugin-environment.test.ts": 2310, - "server/src/__tests__/heartbeat-project-env.test.ts": 24, - "server/src/__tests__/heartbeat-responsible-user-invariant.test.ts": 6285, - "server/src/__tests__/heartbeat-retry-scheduling.test.ts": 3373, - "server/src/__tests__/heartbeat-run-log.test.ts": 5, - "server/src/__tests__/heartbeat-run-summary.test.ts": 6, - "server/src/__tests__/heartbeat-runtime-skills.test.ts": 2681, - "server/src/__tests__/heartbeat-runtime-state.test.ts": 2322, - "server/src/__tests__/heartbeat-scheduling-suppression.test.ts": 5, - "server/src/__tests__/heartbeat-stale-queue-invalidation.test.ts": 11573, - "server/src/__tests__/heartbeat-start-lock.test.ts": 8, - "server/src/__tests__/heartbeat-timer-wake-session-reset-pf4.test.ts": 6, - "server/src/__tests__/heartbeat-workspace-branch-containment.test.ts": 6144, - "server/src/__tests__/heartbeat-workspace-finalize-branch.test.ts": 3599, - "server/src/__tests__/heartbeat-workspace-session.test.ts": 185, - "server/src/__tests__/heartbeat-worktree-suppression.test.ts": 2665, - "server/src/__tests__/heartbeat-zombie-guard.test.ts": 5, - "server/src/__tests__/hire-hook.test.ts": 14, - "server/src/__tests__/http-log-policy.test.ts": 5, - "server/src/__tests__/inbox-dismissals.test.ts": 2110, - "server/src/__tests__/instance-settings-service.test.ts": 15, - "server/src/__tests__/instrumentation.test.ts": 27, - "server/src/__tests__/invite-join-grants.test.ts": 6, - "server/src/__tests__/issue-blocker-attention.test.ts": 3329, - "server/src/__tests__/issue-comment-redaction.test.ts": 2383, - "server/src/__tests__/issue-continuation-summary.test.ts": 6, - "server/src/__tests__/issue-execution-policy.test.ts": 35, - "server/src/__tests__/issue-goal-fallback.test.ts": 5, - "server/src/__tests__/issue-liveness.test.ts": 14, - "server/src/__tests__/issue-monitor-scheduler.test.ts": 6810, - "server/src/__tests__/issue-recovery-actions.test.ts": 3556, - "server/src/__tests__/issue-references-service.test.ts": 2184, - "server/src/__tests__/issue-rewake-throttle.test.ts": 7, - "server/src/__tests__/issue-thread-interactions-service.test.ts": 3053, - "server/src/__tests__/issue-thread-interactions-telemetry.test.ts": 2209, - "server/src/__tests__/issue-tree-control-service-unit.test.ts": 6, - "server/src/__tests__/issue-tree-control-service.test.ts": 2498, - "server/src/__tests__/issues-list-query-parsing.test.ts": 42, - "server/src/__tests__/issues-user-context.test.ts": 5, - "server/src/__tests__/join-request-dedupe.test.ts": 4, - "server/src/__tests__/json-schema-secret-refs.test.ts": 4, - "server/src/__tests__/live-events-ws.test.ts": 21, - "server/src/__tests__/log-redaction.test.ts": 6, - "server/src/__tests__/logger-tz.test.ts": 24, - "server/src/__tests__/monthly-spend-service.test.ts": 29, - "server/src/__tests__/openclaw-gateway-adapter.test.ts": 52, - "server/src/__tests__/opencode-local-adapter.test.ts": 8, - "server/src/__tests__/opencode-local-skill-sync.test.ts": 17, - "server/src/__tests__/paperclip-env.test.ts": 5, - "server/src/__tests__/paperclip-skill-utils.test.ts": 18, - "server/src/__tests__/parse-status-filter.test.ts": 6, - "server/src/__tests__/pi-local-adapter-environment.test.ts": 128, - "server/src/__tests__/pi-local-execute.test.ts": 228, - "server/src/__tests__/pi-local-skill-sync.test.ts": 17, - "server/src/__tests__/pipelines-service.test.ts": 4478, - "server/src/__tests__/plugin-access-authorization-host-services.test.ts": 2259, - "server/src/__tests__/plugin-database.test.ts": 2422, - "server/src/__tests__/plugin-dev-watcher.test.ts": 67, - "server/src/__tests__/plugin-environment-driver-seam.test.ts": 55, - "server/src/__tests__/plugin-execution-workspace-bridge.test.ts": 7, - "server/src/__tests__/plugin-install-autobuild.test.ts": 4336, - "server/src/__tests__/plugin-lifecycle-restart.test.ts": 7, - "server/src/__tests__/plugin-local-folders.test.ts": 63, - "server/src/__tests__/plugin-managed-agents.test.ts": 2407, - "server/src/__tests__/plugin-managed-routines.test.ts": 2371, - "server/src/__tests__/plugin-managed-skills.test.ts": 2600, - "server/src/__tests__/plugin-orchestration-apis.test.ts": 2531, - "server/src/__tests__/plugin-sdk-orchestration-contract.test.ts": 13, - "server/src/__tests__/plugin-sdk-testing.test.ts": 10, - "server/src/__tests__/plugin-secrets-handler.test.ts": 5, - "server/src/__tests__/plugin-telemetry-bridge.test.ts": 36, - "server/src/__tests__/plugin-tenant-isolation.test.ts": 2264, - "server/src/__tests__/plugin-tool-dispatcher-pluginDbId.test.ts": 12, - "server/src/__tests__/plugin-worker-manager.test.ts": 355, - "server/src/__tests__/private-hostname-guard.test.ts": 39, - "server/src/__tests__/productivity-review-service.test.ts": 5180, - "server/src/__tests__/project-icon-persistence.test.ts": 2091, - "server/src/__tests__/project-list-metrics.test.ts": 5, - "server/src/__tests__/project-shortname-resolution.test.ts": 5, - "server/src/__tests__/qa-routine-secrets-e2e.test.ts": 2364, - "server/src/__tests__/quota-windows-service.test.ts": 7, - "server/src/__tests__/quota-windows.test.ts": 59, - "server/src/__tests__/recovery-classifiers.test.ts": 9, - "server/src/__tests__/recovery-stale-issue-lock-sweep.test.ts": 2250, - "server/src/__tests__/redact-sensitive.test.ts": 7, - "server/src/__tests__/routine-run-telemetry.test.ts": 2157, - "server/src/__tests__/routines-service.test.ts": 5411, - "server/src/__tests__/run-continuations.test.ts": 7, - "server/src/__tests__/run-liveness.test.ts": 11, - "server/src/__tests__/runtime-api.test.ts": 6, - "server/src/__tests__/sandbox-provider-runtime.test.ts": 9, - "server/src/__tests__/secret-provider-registry.test.ts": 6, - "server/src/__tests__/secrets-service.test.ts": 3281, - "server/src/__tests__/server-info.test.ts": 300, - "server/src/__tests__/server-package-build-script.test.ts": 3, - "server/src/__tests__/server-startup-feedback-export.test.ts": 27, - "server/src/__tests__/shared-telemetry-events.test.ts": 8, - "server/src/__tests__/skills-catalog-service.test.ts": 39, - "server/src/__tests__/source-trust.test.ts": 2204, - "server/src/__tests__/static-index-html.test.ts": 28, - "server/src/__tests__/storage-local-provider.test.ts": 23, - "server/src/__tests__/task-watchdogs-classifier.test.ts": 9, - "server/src/__tests__/task-watchdogs-scheduler.test.ts": 3245, - "server/src/__tests__/teams-catalog-install-no-overrides.test.ts": 2995, - "server/src/__tests__/teams-catalog-service.test.ts": 75, - "server/src/__tests__/telemetry-client-flush.test.ts": 12, - "server/src/__tests__/trust-preset-resolver.test.ts": 10, - "server/src/__tests__/trust-proxy.test.ts": 11, - "server/src/__tests__/ui-branding.test.ts": 6, - "server/src/__tests__/version.test.ts": 11, - "server/src/__tests__/vite-html-renderer.test.ts": 6, - "server/src/__tests__/work-products.test.ts": 6, - "server/src/__tests__/work-timeline-service.test.ts": 2541, - "server/src/__tests__/workspace-runtime.test.ts": 28685, - "server/src/__tests__/worktree-config.test.ts": 29, - "server/src/adapters/claude-agent-id-header.test.ts": 6, - "server/src/adapters/http/execute.test.ts": 7, - "server/src/middleware/cloud-tenant-actor.test.ts": 10, - "server/src/services/adapter-models-env.test.ts": 5, - "server/src/services/adapter-registry-bootstrap.reconcile.test.ts": 7, - "server/src/services/adapter-registry-bootstrap.test.ts": 7, - "server/src/services/environment-custom-image-terminal-sessions.test.ts": 11, - "server/src/services/execution-allowlist.test.ts": 6, - "server/src/services/execution-policy-bootstrap.test.ts": 15, - "server/src/services/heartbeat-run-runtime-status.test.ts": 9, - "server/src/services/heartbeat-stop-metadata.test.ts": 6, - "server/src/services/issue-thread-interactions.test.ts": 757, - "server/src/services/recovery/model-profile-hint.test.ts": 4, - "server/src/services/recovery/service.pause-durability.test.ts": 4, - "server/src/services/recovery/successful-run-handoff.test.ts": 10, - "server/src/services/responsible-user-denial-run-outcomes.test.ts": 8, - "server/src/services/routines-formatter-cache.test.ts": 1029, - "server/src/services/run-scratch.test.ts": 16, - "server/src/services/session-workspace-cwd.test.ts": 4 + "server/src/__tests__/access-service.test.ts": 5304, + "server/src/__tests__/access-validators.test.ts": 376, + "server/src/__tests__/activity-log-responsible-user.test.ts": 4009, + "server/src/__tests__/activity-service.test.ts": 4368, + "server/src/__tests__/adapter-models.test.ts": 900, + "server/src/__tests__/adapter-registry.test.ts": 869, + "server/src/__tests__/adapter-session-codecs.test.ts": 368, + "server/src/__tests__/agent-auth-jwt.test.ts": 343, + "server/src/__tests__/agent-auth-middleware.test.ts": 946, + "server/src/__tests__/agent-instructions-service.test.ts": 228, + "server/src/__tests__/agent-invokability.test.ts": 888, + "server/src/__tests__/agent-permissions-service.test.ts": 318, + "server/src/__tests__/agent-shortname-collision.test.ts": 1394, + "server/src/__tests__/agent-skill-contract.test.ts": 222, + "server/src/__tests__/agents-adapter-config-user-secret.test.ts": 5334, + "server/src/__tests__/agents-pending-approval-config.test.ts": 5994, + "server/src/__tests__/agents-service-clear-error.test.ts": 5886, + "server/src/__tests__/agents-service-secret-bindings.test.ts": 4856, + "server/src/__tests__/api-compression.test.ts": 277, + "server/src/__tests__/app-hmr-port.test.ts": 2005, + "server/src/__tests__/app-private-hostname-gate.test.ts": 3503, + "server/src/__tests__/app-vite-dev-routing.test.ts": 2039, + "server/src/__tests__/approvals-service.test.ts": 782, + "server/src/__tests__/attachment-types.test.ts": 404, + "server/src/__tests__/attention-service.test.ts": 5183, + "server/src/__tests__/authorization-service.test.ts": 5278, + "server/src/__tests__/aws-secrets-manager-provider.test.ts": 320, + "server/src/__tests__/better-auth.test.ts": 873, + "server/src/__tests__/board-claim.test.ts": 4834, + "server/src/__tests__/board-mutation-guard.test.ts": 240, + "server/src/__tests__/body-limits.test.ts": 165, + "server/src/__tests__/budgets-service.test.ts": 4297, + "server/src/__tests__/build-commit.test.ts": 216, + "server/src/__tests__/build-version.test.ts": 203, + "server/src/__tests__/built-in-agents.test.ts": 11393, + "server/src/__tests__/bundled-plugins.test.ts": 191, + "server/src/__tests__/change-consent-gate.test.ts": 4146, + "server/src/__tests__/claude-local-adapter-environment.test.ts": 647, + "server/src/__tests__/claude-local-adapter.test.ts": 262, + "server/src/__tests__/claude-local-execute.test.ts": 2644, + "server/src/__tests__/claude-local-skill-sync.test.ts": 294, + "server/src/__tests__/cleanup-removal-service.test.ts": 5233, + "server/src/__tests__/cloud-image-bundled-plugins.test.ts": 229, + "server/src/__tests__/codex-auth-reconciliation.test.ts": 1054, + "server/src/__tests__/codex-local-adapter-environment.test.ts": 296, + "server/src/__tests__/codex-local-adapter.test.ts": 329, + "server/src/__tests__/codex-local-execute.test.ts": 1440, + "server/src/__tests__/codex-local-skill-injection.test.ts": 318, + "server/src/__tests__/codex-local-skill-sync.test.ts": 293, + "server/src/__tests__/companies-service.test.ts": 6576, + "server/src/__tests__/company-artifacts-service.test.ts": 5890, + "server/src/__tests__/company-portability-import-batching.test.ts": 7925, + "server/src/__tests__/company-search-extract-service.test.ts": 4340, + "server/src/__tests__/company-search-service.test.ts": 5187, + "server/src/__tests__/company-skill-import-boundary.test.ts": 4859, + "server/src/__tests__/company-skill-policy-service.test.ts": 4482, + "server/src/__tests__/company-skill-test-runs-service.test.ts": 7446, + "server/src/__tests__/company-skills-catalog-service.test.ts": 7480, + "server/src/__tests__/company-skills-detail.test.ts": 4740, + "server/src/__tests__/company-skills-service.test.ts": 16803, + "server/src/__tests__/company-skills.test.ts": 1298, + "server/src/__tests__/config-file.test.ts": 399, + "server/src/__tests__/cursor-local-adapter-environment.test.ts": 487, + "server/src/__tests__/cursor-local-adapter.test.ts": 309, + "server/src/__tests__/cursor-local-execute.test.ts": 1233, + "server/src/__tests__/cursor-local-skill-injection.test.ts": 228, + "server/src/__tests__/cursor-local-skill-sync.test.ts": 275, + "server/src/__tests__/dashboard-service.test.ts": 4166, + "server/src/__tests__/decision-training.test.ts": 5790, + "server/src/__tests__/decision-wakeup.test.ts": 173, + "server/src/__tests__/decisions-service.test.ts": 6732, + "server/src/__tests__/dev-runner-output.test.ts": 223, + "server/src/__tests__/dev-runner-paths.test.ts": 213, + "server/src/__tests__/dev-runner-snapshot.test.ts": 208, + "server/src/__tests__/dev-runner-worktree.test.ts": 210, + "server/src/__tests__/dev-server-status.test.ts": 180, + "server/src/__tests__/dev-watch-ignore.test.ts": 216, + "server/src/__tests__/docker-entrypoint.test.ts": 280, + "server/src/__tests__/document-annotations-service.test.ts": 5245, + "server/src/__tests__/documents-service.test.ts": 4609, + "server/src/__tests__/documents.test.ts": 889, + "server/src/__tests__/effective-run-config-fingerprints.test.ts": 176, + "server/src/__tests__/environment-config.test.ts": 1200, + "server/src/__tests__/environment-custom-image-terminal-ws.test.ts": 2962, + "server/src/__tests__/environment-custom-images-service.test.ts": 6969, + "server/src/__tests__/environment-execution-target.test.ts": 527, + "server/src/__tests__/environment-live-ssh.test.ts": 1323, + "server/src/__tests__/environment-probe.test.ts": 1427, + "server/src/__tests__/environment-run-orchestrator.test.ts": 1223, + "server/src/__tests__/environment-runtime-driver-contract.test.ts": 5082, + "server/src/__tests__/environment-runtime.test.ts": 10230, + "server/src/__tests__/environment-service.test.ts": 4331, + "server/src/__tests__/environment-test-harness.test.ts": 388, + "server/src/__tests__/error-handler.test.ts": 439, + "server/src/__tests__/execution-lock-orphan-cleanup.test.ts": 5717, + "server/src/__tests__/execution-workspace-policy.test.ts": 479, + "server/src/__tests__/execution-workspaces-service.test.ts": 10891, + "server/src/__tests__/export-fidelity.test.ts": 4019, + "server/src/__tests__/external-objects-service.test.ts": 5043, + "server/src/__tests__/feedback-flush-controller.test.ts": 2076, + "server/src/__tests__/feedback-service.test.ts": 4890, + "server/src/__tests__/feedback-share-client.test.ts": 177, + "server/src/__tests__/file-resources.test.ts": 8357, + "server/src/__tests__/first-admin-claim.test.ts": 3777, + "server/src/__tests__/folders-service.test.ts": 5698, + "server/src/__tests__/forbidden-tokens.test.ts": 181, + "server/src/__tests__/gemini-local-adapter-environment.test.ts": 354, + "server/src/__tests__/gemini-local-adapter.test.ts": 288, + "server/src/__tests__/gemini-local-execute.test.ts": 512, + "server/src/__tests__/gemini-local-skill-sync.test.ts": 225, + "server/src/__tests__/google-sheets-gallery.test.ts": 1467, + "server/src/__tests__/grok-local-skill-sync.test.ts": 264, + "server/src/__tests__/heartbeat-accepted-plan-workspace-refresh.test.ts": 7971, + "server/src/__tests__/heartbeat-active-run-output-watchdog.test.ts": 54470, + "server/src/__tests__/heartbeat-agent-session-message.test.ts": 2430, + "server/src/__tests__/heartbeat-archived-company-guard.test.ts": 4909, + "server/src/__tests__/heartbeat-auto-checkout.test.ts": 1346, + "server/src/__tests__/heartbeat-comment-wake-batching.test.ts": 9868, + "server/src/__tests__/heartbeat-context-summary.test.ts": 1415, + "server/src/__tests__/heartbeat-cost-accounting.test.ts": 1336, + "server/src/__tests__/heartbeat-issue-rewake-throttle.test.ts": 8207, + "server/src/__tests__/heartbeat-ledger-billing-code.test.ts": 1694, + "server/src/__tests__/heartbeat-list.test.ts": 5178, + "server/src/__tests__/heartbeat-local-environment.test.ts": 9551, + "server/src/__tests__/heartbeat-lock-release-on-reassignment.test.ts": 5037, + "server/src/__tests__/heartbeat-model-profile.test.ts": 1718, + "server/src/__tests__/heartbeat-plugin-environment.test.ts": 5394, + "server/src/__tests__/heartbeat-project-env.test.ts": 1468, + "server/src/__tests__/heartbeat-referenced-projects.test.ts": 4918, + "server/src/__tests__/heartbeat-remote-referenced-projects.test.ts": 1434, + "server/src/__tests__/heartbeat-responsible-user-invariant.test.ts": 6896, + "server/src/__tests__/heartbeat-retry-scheduling.test.ts": 9571, + "server/src/__tests__/heartbeat-run-log.test.ts": 1667, + "server/src/__tests__/heartbeat-run-status-payload.test.ts": 1655, + "server/src/__tests__/heartbeat-run-summary.test.ts": 208, + "server/src/__tests__/heartbeat-runtime-mcp-servers.test.ts": 4906, + "server/src/__tests__/heartbeat-runtime-skills.test.ts": 6987, + "server/src/__tests__/heartbeat-runtime-state.test.ts": 5073, + "server/src/__tests__/heartbeat-scheduling-suppression.test.ts": 1607, + "server/src/__tests__/heartbeat-stale-queue-invalidation.test.ts": 18374, + "server/src/__tests__/heartbeat-start-lock.test.ts": 419, + "server/src/__tests__/heartbeat-timer-wake-session-reset-pf4.test.ts": 1422, + "server/src/__tests__/heartbeat-workspace-branch-containment.test.ts": 8505, + "server/src/__tests__/heartbeat-workspace-finalize-branch.test.ts": 6790, + "server/src/__tests__/heartbeat-workspace-ready-comment.test.ts": 1335, + "server/src/__tests__/heartbeat-workspace-session.test.ts": 2022, + "server/src/__tests__/heartbeat-worktree-suppression.test.ts": 8319, + "server/src/__tests__/heartbeat-zombie-guard.test.ts": 1408, + "server/src/__tests__/hire-hook.test.ts": 968, + "server/src/__tests__/http-log-policy.test.ts": 216, + "server/src/__tests__/http-log-redaction.test.ts": 258, + "server/src/__tests__/inbox-dismissals.test.ts": 5254, + "server/src/__tests__/instance-settings-managed-overlay.test.ts": 912, + "server/src/__tests__/instance-settings-service.test.ts": 944, + "server/src/__tests__/instrumentation.test.ts": 196, + "server/src/__tests__/invite-join-grants.test.ts": 398, + "server/src/__tests__/invite-rate-limit.test.ts": 167, + "server/src/__tests__/invite-token-entropy.test.ts": 1850, + "server/src/__tests__/issue-blocker-attention.test.ts": 6110, + "server/src/__tests__/issue-comment-redaction.test.ts": 5411, + "server/src/__tests__/issue-continuation-summary.test.ts": 926, + "server/src/__tests__/issue-execution-policy.test.ts": 463, + "server/src/__tests__/issue-goal-fallback.test.ts": 209, + "server/src/__tests__/issue-liveness.test.ts": 408, + "server/src/__tests__/issue-monitor-scheduler.test.ts": 11200, + "server/src/__tests__/issue-recovery-actions.test.ts": 7969, + "server/src/__tests__/issue-references-service.test.ts": 4270, + "server/src/__tests__/issue-rewake-throttle.test.ts": 179, + "server/src/__tests__/issue-thread-interactions-service.test.ts": 7260, + "server/src/__tests__/issue-thread-interactions-telemetry.test.ts": 4518, + "server/src/__tests__/issue-tree-control-service-unit.test.ts": 725, + "server/src/__tests__/issue-tree-control-service.test.ts": 4666, + "server/src/__tests__/issues-list-query-parsing.test.ts": 941, + "server/src/__tests__/issues-user-context.test.ts": 889, + "server/src/__tests__/join-request-dedupe.test.ts": 225, + "server/src/__tests__/json-schema-secret-refs.test.ts": 202, + "server/src/__tests__/live-events-ws.test.ts": 788, + "server/src/__tests__/log-redaction.test.ts": 216, + "server/src/__tests__/logger-tz.test.ts": 241, + "server/src/__tests__/managed-config.test.ts": 411, + "server/src/__tests__/mcp-http.test.ts": 165, + "server/src/__tests__/monthly-spend-service.test.ts": 1692, + "server/src/__tests__/openclaw-gateway-adapter.test.ts": 328, + "server/src/__tests__/opencode-local-adapter.test.ts": 287, + "server/src/__tests__/opencode-local-skill-sync.test.ts": 224, + "server/src/__tests__/paperclip-env.test.ts": 465, + "server/src/__tests__/paperclip-skill-utils.test.ts": 250, + "server/src/__tests__/parse-status-filter.test.ts": 1075, + "server/src/__tests__/pi-local-adapter-environment.test.ts": 309, + "server/src/__tests__/pi-local-execute.test.ts": 424, + "server/src/__tests__/pi-local-skill-sync.test.ts": 268, + "server/src/__tests__/pipelines-service.test.ts": 6851, + "server/src/__tests__/plugin-access-authorization-host-services.test.ts": 5294, + "server/src/__tests__/plugin-agent-sessions.test.ts": 1630, + "server/src/__tests__/plugin-config-startup-delivery.test.ts": 3893, + "server/src/__tests__/plugin-database.test.ts": 4724, + "server/src/__tests__/plugin-dev-watcher.test.ts": 502, + "server/src/__tests__/plugin-environment-driver-ready-recovery.test.ts": 3502, + "server/src/__tests__/plugin-environment-driver-seam.test.ts": 525, + "server/src/__tests__/plugin-execution-workspace-bridge.test.ts": 221, + "server/src/__tests__/plugin-install-autobuild.test.ts": 6870, + "server/src/__tests__/plugin-install-guard.test.ts": 1046, + "server/src/__tests__/plugin-lifecycle-restart.test.ts": 1017, + "server/src/__tests__/plugin-local-folders.test.ts": 285, + "server/src/__tests__/plugin-managed-agents.test.ts": 5460, + "server/src/__tests__/plugin-managed-routines.test.ts": 5584, + "server/src/__tests__/plugin-managed-skills.test.ts": 6803, + "server/src/__tests__/plugin-orchestration-apis.test.ts": 8315, + "server/src/__tests__/plugin-sandbox-provider-config-validation.test.ts": 209, + "server/src/__tests__/plugin-sdk-orchestration-contract.test.ts": 481, + "server/src/__tests__/plugin-sdk-testing.test.ts": 398, + "server/src/__tests__/plugin-secrets-handler.test.ts": 4589, + "server/src/__tests__/plugin-telemetry-bridge.test.ts": 1825, + "server/src/__tests__/plugin-tenant-isolation.test.ts": 5019, + "server/src/__tests__/plugin-tool-dispatcher-pluginDbId.test.ts": 830, + "server/src/__tests__/plugin-ui-static.test.ts": 920, + "server/src/__tests__/plugin-worker-manager.test.ts": 1149, + "server/src/__tests__/private-hostname-guard.test.ts": 278, + "server/src/__tests__/productivity-review-service.test.ts": 9394, + "server/src/__tests__/project-icon-persistence.test.ts": 5775, + "server/src/__tests__/project-list-metrics.test.ts": 784, + "server/src/__tests__/project-shortname-resolution.test.ts": 991, + "server/src/__tests__/qa-routine-secrets-e2e.test.ts": 5272, + "server/src/__tests__/quota-windows-service.test.ts": 170, + "server/src/__tests__/quota-windows.test.ts": 360, + "server/src/__tests__/recovery-classifiers.test.ts": 1490, + "server/src/__tests__/recovery-observability.test.ts": 4447, + "server/src/__tests__/recovery-stale-issue-lock-sweep.test.ts": 4853, + "server/src/__tests__/redact-sensitive.test.ts": 219, + "server/src/__tests__/remote-http-endpoint-guard.test.ts": 211, + "server/src/__tests__/routable-blocked.test.ts": 168, + "server/src/__tests__/routine-run-telemetry.test.ts": 4859, + "server/src/__tests__/routines-service.test.ts": 9383, + "server/src/__tests__/run-continuations.test.ts": 767, + "server/src/__tests__/run-liveness.test.ts": 226, + "server/src/__tests__/runtime-api.test.ts": 173, + "server/src/__tests__/sandbox-provider-runtime.test.ts": 174, + "server/src/__tests__/secret-provider-registry.test.ts": 289, + "server/src/__tests__/secrets-service-user-secret-owner-scoped.test.ts": 4889, + "server/src/__tests__/secrets-service.test.ts": 7056, + "server/src/__tests__/server-info.test.ts": 597, + "server/src/__tests__/server-package-build-script.test.ts": 210, + "server/src/__tests__/server-startup-feedback-export.test.ts": 1325, + "server/src/__tests__/shared-telemetry-events.test.ts": 186, + "server/src/__tests__/skills-catalog-service.test.ts": 210, + "server/src/__tests__/smoke-lab.test.ts": 5240, + "server/src/__tests__/source-trust.test.ts": 4173, + "server/src/__tests__/static-index-html.test.ts": 300, + "server/src/__tests__/status-card-update-engine.test.ts": 327, + "server/src/__tests__/status-cards.test.ts": 7663, + "server/src/__tests__/storage-local-provider.test.ts": 185, + "server/src/__tests__/summary-slots.test.ts": 6169, + "server/src/__tests__/task-watchdogs-classifier.test.ts": 1103, + "server/src/__tests__/task-watchdogs-scheduler.test.ts": 5996, + "server/src/__tests__/teams-catalog-install-no-overrides.test.ts": 7509, + "server/src/__tests__/teams-catalog-service.test.ts": 492, + "server/src/__tests__/telemetry-client-flush.test.ts": 214, + "server/src/__tests__/tool-access-policy-service.test.ts": 5303, + "server/src/__tests__/tool-access-service.test.ts": 16497, + "server/src/__tests__/tool-content-guards.test.ts": 220, + "server/src/__tests__/tool-gateway-service.test.ts": 7360, + "server/src/__tests__/tool-gateway.test.ts": 11686, + "server/src/__tests__/tool-oauth-legacy-backfill.test.ts": 4623, + "server/src/__tests__/trust-preset-resolver.test.ts": 396, + "server/src/__tests__/trust-proxy.test.ts": 275, + "server/src/__tests__/ui-branding.test.ts": 210, + "server/src/__tests__/version.test.ts": 190, + "server/src/__tests__/vite-html-renderer.test.ts": 164, + "server/src/__tests__/work-products.test.ts": 789, + "server/src/__tests__/work-timeline-service.test.ts": 5529, + "server/src/__tests__/workspace-runtime.test.ts": 35281, + "server/src/__tests__/worktree-config.test.ts": 230, + "server/src/__tests__/write-path-membership.test.ts": 914, + "server/src/adapters/claude-agent-id-header.test.ts": 207, + "server/src/adapters/http/execute.test.ts": 354, + "server/src/instrumentation.test.ts": 229, + "server/src/middleware/cloud-tenant-actor.test.ts": 814, + "server/src/services/adapter-models-env.test.ts": 199, + "server/src/services/adapter-registry-bootstrap.reconcile.test.ts": 852, + "server/src/services/adapter-registry-bootstrap.test.ts": 823, + "server/src/services/environment-custom-image-terminal-sessions.test.ts": 218, + "server/src/services/execution-allowlist.test.ts": 175, + "server/src/services/execution-policy-bootstrap.test.ts": 696, + "server/src/services/heartbeat-run-runtime-status.test.ts": 227, + "server/src/services/heartbeat-stop-metadata.test.ts": 213, + "server/src/services/hot-restart.test.ts": 301, + "server/src/services/issue-thread-interactions.test.ts": 1104, + "server/src/services/managed-environments.test.ts": 1190, + "server/src/services/recovery/model-profile-hint.test.ts": 163, + "server/src/services/recovery/provider-failure-classification.test.ts": 1548, + "server/src/services/recovery/service.pause-durability.test.ts": 1497, + "server/src/services/recovery/successful-run-handoff.test.ts": 809, + "server/src/services/responsible-user-denial-run-outcomes.test.ts": 958, + "server/src/services/routines-formatter-cache.test.ts": 2665, + "server/src/services/run-log-store.test.ts": 645, + "server/src/services/run-scratch.test.ts": 232, + "server/src/services/session-workspace-cwd.test.ts": 197, + "server/src/services/workspace-runtime-read-model.test.ts": 749, + "server/src/services/workspace-runtime-ready-comment.test.ts": 1012, + "server/src/shutdown.test.ts": 261 } -} +} \ No newline at end of file