335 Commits
Author SHA1 Message Date
Chinesezjc 2413eab847 ci: isolate non-Windows pnpm setup per run attempt
Stacked on #3115: keep its windows-* setup-pnpm-js-<run_id>-<run_attempt>-<job>
destination, and extend the same isolation to non-Windows jobs in ci.yml
and ci-master.yml with setup-pnpm-<run_id>-<run_attempt>. This prevents
sequential self-hosted Windows jobs from tripping over a stale locked
pnpm.exe/reflink native module.
2026-08-27 11:33:27 +08:00
Chinesezjc 4ed5303f41 Merge pull request #3115 from deepseek-harness/fix/remove-transform-corpus
fix(ci): Windows pnpm setup isolation and spawn budget alignment
2026-08-27 11:14:03 +08:00
Chinesezjc 91379e8de6 ci(build-exe): drop pull_request label trigger to avoid skipped checks (#3049)
* ci(build-exe): drop pull_request label trigger to avoid skipped checks

* docs(build-exe): sync agent note and pin event set in workflow spec

* test(ci): type-safe event key assertion for build-exe workflow

* ci(build-exe): use present-tense trigger comment and drop label-run note
2026-08-26 17:52:34 +08:00
Chinesezjc 84692044af test: raise the contended Windows spawn budgets to 90s
The per-case 15-30s budgets on the Windows native and coverage lanes fire
before oxlint, workflow-worker-thread, and other subprocess-spawning cases
finish under the loaded self-hosted pool; the failures rotate across cases
as load shifts, so per-case widening only moved the flake. Raise the lane
defaults (DSH_COVERAGE_TEST_TIMEOUT_MS and the native --testTimeout) to 90s,
align the oxlint and workflow-worker-thread case budgets, and keep the
built-bin SPAWN_TIMEOUT_MS at 60s under a 90s outer budget.
2026-08-26 17:17:47 +08:00
Chinesezjc 43b5b473bf ci: drop the stale pnpm setup cleanup steps
The windows-* jobs now install pnpm under a run/attempt/job-suffixed
destination, so the pre-install step that cleared the old fixed
setup-pnpm-js path no longer touches the actual destination and its
comment claims stale state. The suffix already gives every job a fresh
directory, so remove the four cleanup steps.
2026-08-26 16:39:30 +08:00
Chinesezjc e87a47692d ci: isolate the Windows pnpm setup destination per job
The windows-* jobs keep a separate standalone pnpm executable under
runner.temp/setup-pnpm-js. A previous job on the same self-hosted runner
can leave a locked @reflink native module there, so the next job's
pnpm/action-setup fails with EPERM during unlink before any test runs.
Suffix the destination with run_id, run_attempt, and job so every job
gets a fresh directory even when sequential jobs land on the same
runner; apply the same to the python SDK exe build. Update the pnpm
setup isolation note to record the Windows-specific destination.
2026-08-26 16:39:30 +08:00
Yichen Jiang 4e1c87b1a2 fix(ci): bound Windows process contention 2026-08-26 14:24:24 +08:00
imccyu f18ab429e4 ci(release): pack rehearsal tarballs concurrently 2026-08-26 12:46:17 +08:00
imccyu e1c49dab59 ci(windows): clear stale pnpm setup state before install 2026-08-26 12:35:05 +08:00
imccyu 75428c7f47 perf(ci) 2026-08-26 12:35:04 +08:00
Dudu-0223 560729be76 ci(windows): serialize native test files 2026-08-25 18:12:03 +08:00
Chinesezjc ac2f00070e ci(windows): make windows-coverage temporarily non-blocking
Other PRs are blocked by Windows ACP half-close tests timing out. Keep the
coverage job running for signal, but remove it from all-checks-passed.needs
until the Windows skip fix is validated.
2026-08-25 17:02:16 +08:00
Chinesezjc 5e7c567dc8 test(subagent-acp): double the per-test timeout relative to default
These tests spawn real ACP child subprocesses. On contended self-hosted
Windows runners the default 30s budget times out. Instead of raising the
global coverage timeout, give this file 2x the configured default
(DSH_COVERAGE_TEST_TIMEOUT_MS) so it follows future default changes.
2026-08-25 16:07:38 +08:00
Chinesezjc 3073107ec4 ci(windows): raise coverage test timeout to 60s
After the 4-partition split, other PRs' windows coverage now fails on
process-bound subagent-acp tests timing out at 30s under self-hosted
concurrency. Give the coverage lane the same 60s per-test budget that the
earlier failover profile used.
2026-08-25 15:56:32 +08:00
Chinesezjc 58cc29b4f1 test(windows): split native job into build/coverage/native-tests/observational
Keep the 4-partition coverage profile, split the monolithic windows-native
job into smaller required jobs (build, coverage, native-tests) plus a
non-blocking observational job. Update ci-workflow.spec for the new topology.
2026-08-25 12:45:47 +08:00
Chinesezjc 55ef5aad06 test(windows): try 4 coverage partitions instead of 8
Under high self-hosted concurrency, 8 partitions per Windows native job
triggered vitest fork worker startup timeouts. This branch lowers Windows
coverage to the same 4 partitions Linux uses, trading some single-job
coverage wall time for lower process-creation pressure.
2026-08-25 12:02:21 +08:00
Tianyi Cui 8101a0d097 fix(python): make Windows release paths native
Run the GitHub Windows runtime leg under the runner’s native PowerShell instead of inheriting the POSIX Bash body. POSIX and Windows now own explicit output resolution, virtual-environment setup, environment scrubbing, and keyless/live black-box commands, while portable build commands continue to use each runner’s default shell.

Put the pinned uv installation on the GitLab Windows job PATH before either the smoke or release builder invokes it. Reject a runtime executable whose basename does not match the selected platform manifest, and reject Intel macOS at platform selection instead of reporting a misleading missing artifact.

Add a complete PowerShell path to the published Python tutorial and record the three-phase shutdown-time bound in the Windows runtime decision. Workflow, Python, and bilingual documentation tests pin the resulting behavior.
2026-08-24 19:09:40 +08:00
Tianyi Cui 026a37fc07 ci(python): gate the Windows x64 installed wheel
Add node24-win-x64 to the required pull-request and public-release matrices on a native windows-2025 runner, and publish the same win_amd64 artifact from the GitLab tag pipeline. GitHub uses Git Bash for the shared release script while selecting the Windows venv's Scripts/python.exe explicitly; the Linux and macOS legs retain their existing commands and native checks.

Run the complete installed-wheel keyless suite and the trusted two-turn DeepSeek smoke on Windows exactly as on the existing targets. Make the minimal blackbox choose persistent PowerShell on Windows, keep advanced and restart snapshots platform-stable by disabling both one-shot shell variants, locate the generated dsh.exe console command, and validate text lines without assuming POSIX newlines.

Workflow tests pin the four-target matrix, Windows runner and wheel tag, cross-platform venv selection, GitLab publication dependency, and full blackbox invocation. The existing POSIX minimal snapshot changes only its platform-neutral prompt wording; Windows owns a separate model-visible snapshot.
2026-08-24 19:09:40 +08:00
Tianyi Cui be7b064504 feat(python-runtime): package the dsh CLI and profile assets
Make the zero-code dsh-python-runtime-closure depend on the real @deepseek-ai/dsh application and every required profile peer, then package apps/cli's built bin instead of the deleted Python carrier. Rename executables to deepseek-harness-sdk-runtime-<platform>-<arch>, update wheel/platform/build workflow discovery, and install a Python dsh console command that requires explicit DSH_HOME before exec.

Include profile, bundle, preset, native addon, and shared-library assets needed by the full CLI. Remove the checked-in default cordis.yml and preserve the existing wheel distribution names, Python module names, sidecar validation, and wire identity. Runtime resolution and release tests pin the new artifacts and dev Node carrier.
2026-08-24 17:28:26 +08:00
Chinesezjc cd6941d5d7 Revert "perf(ci): shorten native Windows coverage critical path" 2026-08-24 14:39:56 +08:00
Tianyi Cui 3c1c6a89b1 test(python): gate installed runtime wheels across release targets (#2953)
* test(python): exercise installed wheels as black boxes

Add an installed-wheel mode that refuses source/editable imports, repository working directories, mismatched SDK/runtime versions, unpinned runtime dependencies, and executables outside the installed runtime distribution. The mode resolves the wheel-owned executable itself, so callers cannot accidentally prove an explicit checkout artifact.

Add a real-API scenario that drives two tool-using turns through the public synchronous SDK, verifies the file bytes outside the agent, checks completed turn/tool events and persistence, and projects provider failures without retaining credential-bearing error text. The existing deterministic scenario set remains the keyless behavior oracle.

Refs #2952.

* ci(python): require installed-wheel checks on every release target

Move the complete deterministic runtime scenarios behind construction and clean installation of the SDK and matching runtime wheels. Each native leg runs outside the checkout with source-resolution environment variables removed; Linux manylinux smokes assert the same installed provenance.

Expand the required pull-request call from Linux x64 to Linux x64, Linux arm64, and macOS arm64. Trusted heads receive only DEEPSEEK_API_KEY_EXTERNAL for a fail-loud live two-turn smoke on each carrier, while fork and Dependabot heads retain the full keyless path without exposing secrets.

Pin the reusable secret declaration, matrix call, aggregate dependency, untrusted-head condition, and live/keyless commands in the workflow contract test.

Refs #2952.

* docs(testing): make installed wheels the Python CI authority

Record the clean-wheel provenance boundary, complete keyless scenario set, trusted real-API contract, secret handling, and three-target required topology in a new implemented testing decision. Update the SEA distribution and portable-CI authorities plus the Python contributor reference to describe the same current state.

Archive the fully superseded Linux-x64-only decision after consolidating its rationale and alternatives into the new owner. Preserve its bilingual triplet as a sealed historical snapshot and redirect every active current-state reference.

Refs #2952.
2026-08-23 16:53:55 +08:00
Tianyi Cui 2eea02dae3 ci: bound profile e2e subprocess fan-out
Set DSH_E2E_MAX_WORKERS=4 for the credentialed e2e workflow and pin that environment contract in the workflow test. Profile-launched SDK and ACP scenarios each boot a complete subprocess tree, so the previous file-level fan-out could multiply process and provider pressure far beyond the runner's useful concurrency.

The bound changes scheduling only: every e2e file still runs, the Vitest configuration retains its explicit override knob, and local callers can choose a different positive worker count when their resources allow it.
2026-08-23 10:59:01 +08:00
Tianyi Cui ca53c90a74 Merge pull request #2875 from deepseek-harness/ci/python-release-gray
ci(python): drop PR labeled trigger for python-release dry-run
2026-08-23 10:34:15 +08:00
Tianyi Cui c92c86492d ci: require native Windows aggregate verdict 2026-08-22 20:10:55 +08:00
Tianyi Cui c8cecd6079 perf(ci): raise isolated Windows coverage fan-out 2026-08-22 20:10:55 +08:00
Tianyi Cui 12ad38b234 perf(ci): phase native Windows coverage work 2026-08-22 20:10:55 +08:00
imccyu 54b05a8dcb ci: put the preview-comment marker on its own line 2026-08-21 20:35:34 +08:00
imccyu 304b4b8424 docs: localize a cross-note link in the composer edit-range note 2026-08-21 20:35:33 +08:00
imccyu 3a47674798 ci: add build-preview workflow 2026-08-21 20:35:33 +08:00
imccyu 60e44b2d78 fix: ci
fix: ci

fix: ci
2026-08-21 14:11:06 +08:00
Yichen Jiang fa3e37982b ci(docs): publish the documentation site from a release tag
The documentation site deployed on every master push, with no reviewer and
no version check, while npm, PyPI, and the public source repository all
advance only at a release tag. The Pages site is reachable without
authentication, so a merge published documentation ahead of every artifact
readers could obtain.

docs-pages.yml now declares workflow_dispatch alone and verifies the ref
through the gate npm publication already runs, so the site and the npm
sequence share one definition of a released version.
2026-08-21 13:17:06 +08:00
Chinesezjc 7214d0d958 refactor(python): drop now-always-true build.if
python-release.yml only triggers on workflow_dispatch, so build.if:
github.event_name == 'workflow_dispatch' is always true and redundant; remove it
(the exact event set is already pinned in the spec). Update the spec assertion
accordingly.
2026-08-21 11:55:57 +08:00
imccyu 4f2868409d test(ci): exercise standalone pnpm on Windows 2026-08-21 11:24:03 +08:00
Chinesezjc 499c1262a2 ci(python): drop PR labeled trigger for python-release dry-run
Remove the pull_request:[labeled] trigger from python-release.yml so the
workflow no longer fires (and shows a gray skipped check) when a PR gets any
non-dry-run label. The credential-free dry-run validation is now manual-only
(workflow_dispatch with publish=false), preserving the validation capability
without a PR gray segment.

- python-release.yml: on is workflow_dispatch only; build.if is
  github.event_name == 'workflow_dispatch'.
- ci-workflow.spec.ts: assert python-release has no pull_request event and the
  simplified build.if.
- python/development.(md,zh.md) and 2026-08-11-python-publication-workflow note
  (en/zh/i18n): describe the manual dispatch-only dry-run path.

Verification: ci-workflow.spec.ts 14/14, typecheck clean, note-format 585,
verify-translation-pairing consistent.
2026-08-21 08:56:32 +08:00
Chinesezjc 63d9de0eb3 fix(cic): address gray-check PR review - official build, step-level gate, note sync
Address ds-review-bot findings on PR #2798:

- release-publish.yml: use pnpm run build:official (not build) so the dsh
  pack step's verifyBuildArtifacts (families.ts:327, readClientBuildRecord with
  officialClientBuildEnvironment) finds the official client-build record; build
  would fail Pack release tarballs on a clean runner.
- issue-lifecycle.yml: move the previous job-level if to step level on
  Create project token and Handle repository event, so approved/commented
  reviews pass (job reported success, no gray segment) without minting a
  write-capable App token or touching the board — preserving the original
  least-privilege property.
- ci-workflow.spec.ts: lock the step-level gate on the two lifecycle steps, and
  add a release-workflow invariant test (release.yml/vendor are pack-only;
  release-publish.yml/vendor-publish.yml are workflow_dispatch-only with the
  npm-publish environment and Release-publish group) to prevent #2797 recurrence.
- Update 2026-08-10-event-directed-pr-review-status and 2026-08-10-npm-release-
  sequences notes (en/zh/i18n) to the new split and step-level behavior.

Verification: ci-workflow.spec.ts 14/14, typecheck clean, all five workflows
YAML-parse, verify-translation-pairing consistent, note-format 582.
2026-08-20 15:21:59 +08:00
Chinesezjc a33ed4ddf8 ci: stop PR gray checks from lifecycle and release publish jobs
Remove the three skipped (gray) checks from the PR check panel without changing
functional semantics:

- issue-lifecycle: remove the job-level 'if' that skipped the lifecycle job on
  non-changes-requested pull_request_review events, so it now runs and reports
  success (the lifecycle handler already no-ops for approved/commented reviews).
  The changes-requested board transition is unchanged.
- release.yml / release-vendor.yml: drop the publish job (and its
  workflow_dispatch 'publish' input + RELEASE_PUBLISH pass-through) so it no
  longer appears as a skipped Publish-to-npm check on PRs; the files keep the
  pack job that validates tarballs on PR/push.
- new release-publish.yml / release-vendor-publish.yml: manual workflow_dispatch
  only, repack on the current tree then publish, so publication behaves exactly
  as the old publish job (explicit dispatch, uses the packed bytes) but never
  shows as a PR check.

Update the 2026-08-10 review-status note (en/zh/i18n) and the issue-lifecycle
spec assertion to match the unconditional lifecycle job.

Verification: ci-workflow.spec.ts 19/19, all five workflows YAML-parse, typecheck
clean, verify-translation-pairing consistent, note-format 582.
2026-08-20 13:15:58 +08:00
Chinesezjc 297fff6e9c Merge pull request #2768 from deepseek-harness/ci/split-master-workflows
ci: split master-only jobs into ci-master.yml
2026-08-20 12:19:10 +08:00
Chinesezjc 77437b1f50 docs(e2e): point keyless-gate comment at ci.yml (PR) and ci-master.yml (push)
The e2e comment said the keyless gates run in ci.yml on every push/PR; since the
split, master push is covered by ci-master.yml standby instead.
2026-08-20 11:25:21 +08:00
imccyu 66a7081c15 feat(build): bind client artifacts to build profiles 2026-08-19 18:21:27 +08:00
imccyu 93cbb3799d feat(client): inject public build environment 2026-08-19 18:21:26 +08:00
Chinesezjc 7247de9d3d fix(cic): restore serial-linux drill comment, sync pnpm-isolation note, polish runbook
Address the second review pass on PR #2768:

- Restore the serial-linux-selfhosted drill comment in ci-master.yml (it was
  lost in the split boundary, leaving serial-linux-selfhosted as the only
  comment-less job); adapted to the current-state fact that this workflow never
  listens to pull_request while keeping the no-cache-steps reason, the
  DSH_CI_FAILOVER_LINUX switch guidance, and push-triggered semantics.
- Update 2026-07-29-pnpm-setup-runner-isolation (en/zh + i18n): the regression
  test and setup steps now span ci.yml and ci-master.yml.
- failover-runbook line 19: the push-reachable classification now names
  ci-master.yml for the drills/wine cache and ci.yml for the pull-request jobs,
  dropping the stale pull-request-gated phrasing.
- all-checks-passed comment in ci.yml notes that needs cannot reach across
  workflow files (ci-master job are deliberately outside this PR verdict).

Verification: ci-workflow.spec.ts 13/13, both workflows YAML-parse with correct
concurrency, 3 translation pairs consistent, note-format 575.
2026-08-19 17:44:40 +08:00
Chinesezjc 1d5e4199c8 fix(cic): address CI-split review - restore PR concurrency, fix comment migration, restore deleted spec block
Per review on PR #2768:

- Restore a concurrency block in ci.yml (cancel-in-progress: true) so a fresh
  PR push cancels the superseded run; GitHub has no default PR auto-cancel,
  so removing it would stack a second full 9-job run on every push.
  Update the ci-workflow.spec assertion accordingly.
- Fix comment misplacements from the split boundary: ci.yml's all-checks-passed
  now carries its own branch-protection comment (the drill comment that was
  orphaned above it is gone), and ci-master.yml no longer ends with an orphaned
  all-checks-passed comment.
- Restore the DeepSeek e2e workflow describe-block in ci-workflow.spec.ts that
  the rewrite had silently deleted (e2e.yml is unchanged).
- serial-windows comment no longer claims non-blocking-for-PR/absent-from-needs
  since ci-master never listens to pull_request.
- DSH_TELEMETRY_DISABLED safe-use comment restored in ci-master.yml env; split
  rationale (mi gray segments in PR check) documented in .github/AGENTS.md.

Verification: ci-workflow.spec.ts 13/13, both workflows YAML-parse with correct
concurrency, git diff --check clean.
2026-08-19 17:24:58 +08:00
_Kerman 917ef58f79 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2300 2026-08-19 17:09:18 +08:00
Chinesezjc 61f910d1c6 ci: split master-only jobs into ci-master.yml
Split the single ci.yml into two workflows so the PR check panel stops listing
master-only obs jobs that skip (gray) and block the aggregate green-check:

- ci.yml is now pull_request-only, holding only the 9 PR jobs (node-24,
  node-24-coverage, node-24-consumers, node-compat, python-sdk, python-runtime,
  windows, windows-native, all-checks-passed). It drops the workflow-level
  concurrency block since master carve-outs no longer apply.
- ci-master.yml (new) carries the six master/dispatch jobs (wine-apt-cache,
  serial-linux-selfhosted, serial-macos, serial-windows, and both runner
  benchmarks) with the push-exempt cancel-in-progress block and suite input.
  It does not listen to pull_request, so its jobs never appear in PR checks.

ci.yml keeps the wine apt cache seed/restore (repo-scoped by key), so moving the
producer to ci-master.yml does not break the PR windows job's restore.

Update ci-workflow.spec.ts to assert the two-workflow split: ci-master owns the
drills/benchmarks and the push-exemption concurrency, ci.yml is PR-only without
concurrency. Update the serial-reference, portable-required, failover-runbook,
and pnpm-caching notes (en/zh + i18n) and .github/AGENTS.md to reflect ci-master.

Verification: scripts/ci-workflow.spec.ts 12/12, both workflows YAML-parse,
verify-translation-pairing consistent, verify-agent-note-format passes.
2026-08-19 17:09:18 +08:00
Chinesezjc e122005011 Merge pull request #2744 from deepseek-harness/ci/remove-hosted-serial-linux
ci: remove dead hosted serial-linux job
2026-08-19 16:26:36 +08:00
lsdsjy 9e97269bc5 fix(ci): reuse pinned bubblewrap setup in e2e 2026-08-19 15:42:12 +08:00
Chinesezjc 2824ef7ab4 docs, ci: apply second serial-linux review pass
Address the review findings from the fresh pass on PR #2744:

- 2026-07-21 note L31: the enabled serial references run on the self-hosted
  vm-backup/dsh-win-ci pools and the only remaining disabled hosted serial is
  serial-macos (macos-latest); removed the stale hosted ubuntu-latest/windows-2025
  serial framing and the outdated 'when enabled, serial / windows' clause.
- Drop remaining change-narrative from both notes: L19 (serial / linux, macos)
  and the 2026-07-26 caching note L16/L34 now state only current facts without
  deletion dates/PR numbers; the no-producer fact has one home (L16). zh.ms'
  '直至其过期为逐出' corrected to '直至其被逐出'. Bilingual hashes re-recorded.
- ci.yml TODO notes that re-enabling serial-macos does not restore a Linux
  hosted-cache producer and records the seeder-vs-remove decision direction.
- The Playwright restore's failover-skip comment is now self-contained (the
  VM's persistent browser cache is warm) instead of pointing at the coveragelane
  rationale, which is pnpm-store-specific.

Verification: scripts/ci-workflow.spec.ts passes (12/12), YAML re-parses,
both translation pairs consistent, git diff --check clean.
2026-08-19 15:01:37 +08:00
Chinesezjc 0593293b0a ci, docs: address serial-linux removal review
Apply review feedback on the serial-linux removal (PR #2744):

ci.yml:
- Rewrite the new comments as current-state statements, not change
  narrative (dsh-prose-standard): the TODO names serial-macos as the one
  remaining disabled hosted serial job; serial-macos's intro and the
  self-hosted standby's frozen-archive note no longer narrate the deletion.
- The self-hosted standby's frozen-archive comment states its own reason
  (full history to resolve DSH_ARCHIVE_BASE_REF against github.event.before)
  instead of referenceing a now-nonexistent hosted serial reference.
- Move the hosted-cache comment above the pnpm restore so it covers both
  restore-keys fallback steps, and describe the real consequence (matches the
  archived entry until evict, then cold) instead of the false
  'cold on a lockfile change'. Restore the per-step failover-skip note.

Agent Note 2026-07-26-pnpm-action-setup-for-symmetric-ci-caching:
- Update the restore-only bullet and the consequences closing line (it
  described serial-linux as the active master-push producer of the pnpm store
  cache) to state that no master job produces these hosted keys since the
  producer was removed; the Problem and Alternatives sections are historical
  context and are left unchanged. Re-record the bilingual pair hashes.

Verification: scripts/ci-workflow.spec.ts passes (12/12), YAML re-parses,
both translation pairs consistent, git diff --check clean.
2026-08-19 14:39:03 +08:00
Chinesezjc e6b494ed17 ci: remove dead hosted serial-linux job
serial-linux (hosted ubuntu-latest) has been `if: false` since 2026-07-30 and
never runs. Remove the dead job block and retire the dangling references:

- TODO(hosted-serial-ci) narrowed to the single remaining disabled hosted
  serial job (serial-macos); the hosted linux definition is gone.
- The cache producer comment no longer claims serial-linux refreshes the
  hosted pnpm/Playwright caches; there is currently no active master producer
  for them, so restores are cold on a lockfile change.
- The self-hosted standby's frozen-archive comment no longer cross-references
  the deleted job.
- serial-macos gains its own intro comment since the shared 'hosted reference
  jobs below are disabled' lede was removed.

No runner allocation, required gate, or all-checks-passed.needs reference this
job; the aggregate is unchanged.
2026-08-19 14:00:33 +08:00
_Kerman 18b0edb664 Merge remote-tracking branch 'origin/master' into dshw/pr-deepseek-harness-deepseek-harness-2300
# Conflicts:
#	python/sdk-runtime/package.json
2026-08-19 13:12:47 +08:00