diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 9c377deb79..099908616c 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -60,8 +60,9 @@ jobs: if: >- github.event_name != 'pull_request' || !(github.event.pull_request.head.repo.fork || github.event.pull_request.user.login == 'dependabot[bot]') - # Bounded file parallelism (DSH_E2E_MAX_WORKERS), 120s/test, retry 2. 45m - # still bounds retry storms against a slow API while the happy path fans out. + # Profile e2e files can each own several complete dsh subprocess trees, so + # four file workers preserve process/PTY headroom. Tests retain 120s/test + # and retry 2; 45m still bounds retry storms against a slow API. timeout-minutes: 45 steps: - uses: actions/checkout@v6 @@ -115,6 +116,6 @@ jobs: env: DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY_EXTERNAL }} DEEPSEEK_BASE_URL: https://api.deepseek.com - DSH_E2E_MAX_WORKERS: 14 + DSH_E2E_MAX_WORKERS: 4 DSH_EXAMPLE_MODE: lib run: pnpm run test:e2e diff --git a/scripts/ci-workflow.spec.ts b/scripts/ci-workflow.spec.ts index 4e20692392..1c84f28c78 100644 --- a/scripts/ci-workflow.spec.ts +++ b/scripts/ci-workflow.spec.ts @@ -258,6 +258,15 @@ describe('DeepSeek e2e workflow', () => { }) expect(JSON.stringify(steps)).not.toContain('apt-get') }) + + it('bounds profile subprocess fan-out to the tested e2e default', () => { + const workflow = loadWorkflow('.github/workflows/e2e.yml') + const e2e = workflowJob(workflow, 'e2e') + if (!Array.isArray(e2e.steps)) throw new TypeError('DeepSeek e2e workflow must define steps') + + const step = e2e.steps.filter(isRecord).find(candidate => candidate.name === 'E2E tests (real DeepSeek API)') + expect(step).toMatchObject({ env: { DSH_E2E_MAX_WORKERS: 4 } }) + }) }) describe('E2B e2e workflow', () => {