From 69af0c1374fc918cc6a6039c2a5e5fb5fcddfdfd Mon Sep 17 00:00:00 2001 From: Nathan Rajlich Date: Thu, 16 Apr 2026 18:17:27 -0700 Subject: [PATCH 1/3] ci: upgrade pnpm/action-setup to v5 and read version from package.json (#1785) * ci: upgrade pnpm/action-setup to v6 and read version from package.json Removes hardcoded pnpm version (10.14.0) from all workflows and instead reads the version from the packageManager field in package.json, so CI stays in sync with the version used locally. * ci: update setup-workflow-dev composite action to use pnpm/action-setup@v6 Also removes the pnpm-version input since the action now reads the version from package.json#packageManager. * ci: downgrade pnpm/action-setup to v5 v6 installs pnpm 11 RC/beta, which has a regression (pnpm/pnpm#11264, pnpm/action-setup#225/#227/#228) that causes 'ERR_PNPM_BROKEN_LOCKFILE: expected a single document in the stream' when the project's packageManager pins a 10.x pnpm version. v5 is the latest stable release before v6 and supports reading the version from package.json#packageManager. --- .github/actions/setup-workflow-dev/action.yml | 8 +------- .github/workflows/backport.yml | 4 +--- .github/workflows/debug-windows.yml | 4 +--- .github/workflows/docs-checks.yml | 8 ++------ .github/workflows/lint.yml | 4 +--- .github/workflows/release.yml | 4 +--- .github/workflows/tests.yml | 8 ++------ 7 files changed, 9 insertions(+), 31 deletions(-) diff --git a/.github/actions/setup-workflow-dev/action.yml b/.github/actions/setup-workflow-dev/action.yml index 44da12c1bc..d12b3eff98 100644 --- a/.github/actions/setup-workflow-dev/action.yml +++ b/.github/actions/setup-workflow-dev/action.yml @@ -6,10 +6,6 @@ inputs: description: 'Node.js version to use' required: false default: '22.x' - pnpm-version: - description: 'pnpm version to use' - required: false - default: '10.14.0' setup-rust: description: 'Whether to setup Rust toolchain' required: false @@ -37,9 +33,7 @@ runs: toolchain: stable - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: ${{ inputs.pnpm-version }} + uses: pnpm/action-setup@v5 - name: Setup Node.js ${{ inputs.node-version }} uses: actions/setup-node@v4 diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index dc40001677..971051af36 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -29,9 +29,7 @@ jobs: token: ${{ steps.app-token.outputs.token }} - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: 10.14.0 + uses: pnpm/action-setup@v5 - name: Setup Node.js uses: actions/setup-node@v4 diff --git a/.github/workflows/debug-windows.yml b/.github/workflows/debug-windows.yml index 919886b3ba..82e4bcf09e 100644 --- a/.github/workflows/debug-windows.yml +++ b/.github/workflows/debug-windows.yml @@ -27,9 +27,7 @@ jobs: target: wasm32-unknown-unknown - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: 10.14.0 + uses: pnpm/action-setup@v5 - name: Setup Node.js 22.x uses: actions/setup-node@v4 diff --git a/.github/workflows/docs-checks.yml b/.github/workflows/docs-checks.yml index 3454e963d3..b062e6e335 100644 --- a/.github/workflows/docs-checks.yml +++ b/.github/workflows/docs-checks.yml @@ -26,9 +26,7 @@ jobs: uses: actions/checkout@v4 - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: 10.14.0 + uses: pnpm/action-setup@v5 - name: Setup Node.js 22.x uses: actions/setup-node@v4 @@ -57,9 +55,7 @@ jobs: uses: actions/checkout@v4 - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: 10.14.0 + uses: pnpm/action-setup@v5 - name: Setup Node.js 22.x uses: actions/setup-node@v4 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2948e2d3d5..7728dcc1c5 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -47,9 +47,7 @@ jobs: uses: actions/checkout@v4 - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: 10.14.0 + uses: pnpm/action-setup@v5 - name: Setup Node.js 22.x uses: actions/setup-node@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f908da9008..d514d22ec8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,9 +42,7 @@ jobs: git config user.email "${{ steps.app-token.outputs.app-slug }}[bot]@users.noreply.github.com" - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: 10.14.0 + uses: pnpm/action-setup@v5 - name: Setup Node.js 24.x uses: actions/setup-node@v4 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 768e857a2f..e9e007a303 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -160,9 +160,7 @@ jobs: ref: ${{ github.event.pull_request.head.sha || github.sha }} - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: 10.14.0 + uses: pnpm/action-setup@v5 - name: Setup Node.js 22.x uses: actions/setup-node@v4 @@ -601,9 +599,7 @@ jobs: target: wasm32-unknown-unknown - name: Setup pnpm - uses: pnpm/action-setup@v3 - with: - version: 10.14.0 + uses: pnpm/action-setup@v5 - name: Setup Node.js 22.x uses: actions/setup-node@v4 From 5e0a0c7ab0cbb12bac34ffdef84561107365f92d Mon Sep 17 00:00:00 2001 From: Nathan Rajlich Date: Thu, 16 Apr 2026 18:23:17 -0700 Subject: [PATCH 2/3] Prefer stable version for docs app conflicts in backport workflow (#1791) * Prefer stable version for docs app conflicts in backport workflow After #1786 restored a minimal Next.js placeholder docs app on stable, docs app conflicts should resolve to the stable branch version rather than being deleted. Only docs/content/ is actively maintained on stable, so conflicts there should still be resolved normally. Update both the auto-resolution logic in backport.yml and the AI prompt to reflect the new policy, and update AGENTS.md to match. * Use git show :2:$file to detect ours-side presence in conflicts git ls-files --error-unmatch succeeds for unmerged paths even when the file only exists on the incoming (theirs) side, which would then fail on git checkout --ours. Use git show :2:$file to specifically check for a stage-2 entry, which indicates the file exists on the ours (stable) side. --- .github/workflows/backport.yml | 33 +++++++++++++++++++++++---------- AGENTS.md | 4 ++-- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index 971051af36..f26a345646 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -47,12 +47,22 @@ jobs: echo "status=clean" >> "$GITHUB_OUTPUT" echo "cherry_pick_sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" else - # The docs app is not maintained on the stable branch (only - # docs/content/ is kept for npm prepack scripts). Auto-resolve - # any non-content docs/ conflicts by deleting the files. + # The docs app on the stable branch is a minimal placeholder — + # only docs/content/ is actively maintained (markdown files + # bundled into npm packages via prepack scripts). Auto-resolve + # any non-content docs/ conflicts by keeping the stable branch + # version (discarding the incoming change from main). git diff --name-only --diff-filter=U | grep '^docs/' | grep -v '^docs/content/' | while IFS= read -r file; do - echo "Auto-resolving docs conflict (deleting): $file" - git rm -f -- "$file" + echo "Auto-resolving docs conflict (keeping stable version): $file" + # Check for a stage-2 ("ours") entry in the index, which means + # the file exists on the stable side of the conflict. Otherwise + # the file was newly added on main and we drop it. + if git show ":2:$file" >/dev/null 2>&1; then + git checkout --ours -- "$file" + git add -- "$file" + else + git rm -f -- "$file" + fi done || true # Lockfile conflicts can be resolved by re-running pnpm install, @@ -110,11 +120,14 @@ jobs: PR title: $PR_TITLE Commit message: $COMMIT_MSG - IMPORTANT: Only docs/content/ exists on the stable branch (the rest - of the docs app is removed). If any remaining conflicts involve files - under docs/ that are NOT in docs/content/, resolve them by deleting - the file with "git rm". Conflicts in docs/content/ should be resolved - normally (these are markdown files bundled into npm packages). + IMPORTANT: On the stable branch, only docs/content/ is actively + maintained (markdown files bundled into npm packages). The rest of + the docs app is a minimal placeholder. If any remaining conflicts + involve files under docs/ that are NOT in docs/content/, resolve + them by keeping the stable branch version (the <<<<<<< HEAD side) + and discarding the incoming change from main. If the file does not + exist on the stable side (HEAD side is empty), remove it with + "git rm". Conflicts in docs/content/ should be resolved normally. Resolve all merge conflicts in the working tree. The content between <<<<<<< HEAD and ======= is the current stable branch. The content between diff --git a/AGENTS.md b/AGENTS.md index dd19705673..21accc7d68 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -173,7 +173,7 @@ This repository uses a dual-branch release model with [changesets](https://githu Both branches trigger the release workflow (`.github/workflows/release.yml`) on push. The changesets action creates a "Version Packages" PR on each branch when there are pending changesets. -**Important:** The docs app (everything under `docs/` except `docs/content/`) is **not maintained on the `stable` branch**. Documentation is deployed only from `main`. The `docs/content/` directory is kept on `stable` because the markdown files are bundled into npm packages via `prepack` scripts. When backporting changes to `stable`, any conflicts involving docs app files (outside of `docs/content/`) should be resolved by deleting the conflicting files. Conflicts in `docs/content/` should be resolved normally. The backport GitHub Action handles this automatically. +**Important:** On the `stable` branch, only `docs/content/` is actively maintained — the rest of the docs app is a minimal placeholder. Documentation is deployed only from `main`. The `docs/content/` directory is kept on `stable` because the markdown files are bundled into npm packages via `prepack` scripts. When backporting changes to `stable`, any conflicts involving docs app files (outside of `docs/content/`) should be resolved by keeping the `stable` branch version (discarding the incoming change from `main`). Conflicts in `docs/content/` should be resolved normally. The backport GitHub Action handles this automatically. ### Changesets @@ -192,7 +192,7 @@ Both branches trigger the release workflow (`.github/workflows/release.yml`) on To backport a change from `main` to `stable`, add the `backport-stable` label to the PR on `main`. A GitHub Action (`.github/workflows/backport.yml`) will automatically cherry-pick the squashed commit to `stable`. The label can be added before or after merging — the action triggers on both merge and label events. The changeset file is included in the cherry-pick, so the correct semver bump type is preserved on `stable`. -If the cherry-pick fails due to conflicts, the action first auto-resolves any docs app conflicts (files under `docs/` except `docs/content/`, since the docs app is not maintained on `stable`) and `pnpm-lock.yaml` conflicts (by re-running `pnpm install`). If those resolve everything, the cherry-pick is pushed directly to `stable`. Otherwise, it attempts to resolve remaining conflicts using [opencode](https://opencode.ai) (AI-powered conflict resolution). If successful, it creates a PR targeting `stable` for human review instead of pushing directly. If the AI cannot resolve the conflicts, the action will comment on the original PR with instructions for manual resolution. +If the cherry-pick fails due to conflicts, the action first auto-resolves any docs app conflicts (files under `docs/` except `docs/content/`) by keeping the `stable` branch version, since the docs app is a minimal placeholder on `stable` and not actively maintained there. It also auto-resolves `pnpm-lock.yaml` conflicts by re-running `pnpm install`. If those resolve everything, the cherry-pick is pushed directly to `stable`. Otherwise, it attempts to resolve remaining conflicts using [opencode](https://opencode.ai) (AI-powered conflict resolution). If successful, it creates a PR targeting `stable` for human review instead of pushing directly. If the AI cannot resolve the conflicts, the action will comment on the original PR with instructions for manual resolution. ### Pre-release Lifecycle From 71d594c5dd612ceac4739c4b2f55ef08881f3410 Mon Sep 17 00:00:00 2001 From: Peter Wielander Date: Thu, 16 Apr 2026 18:34:18 -0700 Subject: [PATCH 3/3] [ci] Skip community world E2E tests on main (#1783) --- .changeset/skip-community-worlds-main.md | 4 +++ .github/workflows/tests.yml | 42 +++++++----------------- 2 files changed, 15 insertions(+), 31 deletions(-) create mode 100644 .changeset/skip-community-worlds-main.md diff --git a/.changeset/skip-community-worlds-main.md b/.changeset/skip-community-worlds-main.md new file mode 100644 index 0000000000..1f83f96378 --- /dev/null +++ b/.changeset/skip-community-worlds-main.md @@ -0,0 +1,4 @@ +--- +--- + +Disable community world E2E jobs on `main` CI and drop them from the required checks. Community worlds target an older spec version and don't yet support the CBOR queue transport; they continue to run on `stable`. diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e9e007a303..b3ed5bf0a2 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -667,10 +667,15 @@ jobs: if-no-files-found: ignore # Community World E2E Tests (dynamically generated from worlds-manifest.json) + # Disabled on main: community worlds target spec v2 and do not yet support the + # CBOR queue transport used by world-vercel (see #1627 / #1658). They continue + # to run on `stable`, where spec v2 is still the primary compat target. Once + # the community worlds (mizzle-dev/workflow-worlds) ship CBOR support we can + # re-enable these jobs here. getCommunityWorldsMatrix: name: Get Community Worlds Matrix runs-on: ubuntu-latest - if: ${{ !contains(github.event.pull_request.labels.*.name, 'workflow-server-test') }} + if: false outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: @@ -689,7 +694,7 @@ jobs: e2e-community: name: E2E Community World (${{ matrix.world.name }}) - if: ${{ !contains(github.event.pull_request.labels.*.name, 'workflow-server-test') }} + if: false needs: getCommunityWorldsMatrix strategy: fail-fast: false @@ -708,7 +713,7 @@ jobs: summary: name: E2E Summary runs-on: ubuntu-latest - needs: [e2e-vercel-prod, e2e-local-dev, e2e-local-prod, e2e-local-postgres, e2e-windows, e2e-community] + needs: [e2e-vercel-prod, e2e-local-dev, e2e-local-prod, e2e-local-postgres, e2e-windows] if: always() && !cancelled() timeout-minutes: 10 @@ -740,28 +745,19 @@ jobs: LOCAL_PROD_STATUS="${{ needs.e2e-local-prod.result }}" POSTGRES_STATUS="${{ needs.e2e-local-postgres.result }}" WINDOWS_STATUS="${{ needs.e2e-windows.result }}" - COMMUNITY_STATUS="${{ needs.e2e-community.result }}" echo "vercel=$VERCEL_STATUS" >> $GITHUB_OUTPUT echo "local-dev=$LOCAL_DEV_STATUS" >> $GITHUB_OUTPUT echo "local-prod=$LOCAL_PROD_STATUS" >> $GITHUB_OUTPUT echo "postgres=$POSTGRES_STATUS" >> $GITHUB_OUTPUT echo "windows=$WINDOWS_STATUS" >> $GITHUB_OUTPUT - echo "community=$COMMUNITY_STATUS" >> $GITHUB_OUTPUT - # Community world failures are warnings, not errors if [[ "$VERCEL_STATUS" == "failure" || "$LOCAL_DEV_STATUS" == "failure" || "$LOCAL_PROD_STATUS" == "failure" || "$POSTGRES_STATUS" == "failure" || "$WINDOWS_STATUS" == "failure" ]]; then echo "has_failures=true" >> $GITHUB_OUTPUT else echo "has_failures=false" >> $GITHUB_OUTPUT fi - if [[ "$COMMUNITY_STATUS" == "failure" ]]; then - echo "has_warnings=true" >> $GITHUB_OUTPUT - else - echo "has_warnings=false" >> $GITHUB_OUTPUT - fi - - name: Update PR comment with results if: github.event_name == 'pull_request' uses: marocchino/sticky-pull-request-comment@v2 @@ -787,25 +783,12 @@ jobs: Check the [workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details. - - name: Append community warning to PR comment - if: github.event_name == 'pull_request' && steps.check-status.outputs.has_warnings == 'true' - uses: marocchino/sticky-pull-request-comment@v2 - with: - header: e2e-test-results - append: true - message: | - - --- - ⚠️ **Community world tests failed** (non-blocking): - - Community Worlds: ${{ needs.e2e-community.result }} - - Check the [workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details. - - # Final required check: passes only when unit + all E2E jobs succeed + # Final required check: passes only when unit + all E2E jobs succeed. + # Community worlds are intentionally excluded — they are disabled on main. e2e-required-check: name: E2E Required Check runs-on: ubuntu-latest - needs: [unit, e2e-vercel-prod, e2e-local-dev, e2e-local-prod, e2e-local-postgres, e2e-windows, e2e-community] + needs: [unit, e2e-vercel-prod, e2e-local-dev, e2e-local-prod, e2e-local-postgres, e2e-windows] if: always() timeout-minutes: 5 @@ -818,7 +801,6 @@ jobs: LOCAL_PROD_STATUS: ${{ needs.e2e-local-prod.result }} POSTGRES_STATUS: ${{ needs.e2e-local-postgres.result }} WINDOWS_STATUS: ${{ needs.e2e-windows.result }} - COMMUNITY_STATUS: ${{ needs.e2e-community.result }} HAS_LABEL: ${{ contains(github.event.pull_request.labels.*.name, 'workflow-server-test') }} run: | FAILED_JOBS=() @@ -835,7 +817,6 @@ jobs: [[ "$LOCAL_PROD_STATUS" == "skipped" ]] || echo "Warning: e2e-local-prod was not skipped ($LOCAL_PROD_STATUS)" [[ "$POSTGRES_STATUS" == "skipped" ]] || echo "Warning: e2e-local-postgres was not skipped ($POSTGRES_STATUS)" [[ "$WINDOWS_STATUS" == "skipped" ]] || echo "Warning: e2e-windows was not skipped ($WINDOWS_STATUS)" - [[ "$COMMUNITY_STATUS" == "skipped" ]] || echo "Warning: e2e-community was not skipped ($COMMUNITY_STATUS)" else echo "Standard PR - checking all jobs" [[ "$UNIT_STATUS" == "success" ]] || FAILED_JOBS+=("unit ($UNIT_STATUS)") @@ -844,7 +825,6 @@ jobs: [[ "$LOCAL_PROD_STATUS" == "success" ]] || FAILED_JOBS+=("e2e-local-prod ($LOCAL_PROD_STATUS)") [[ "$POSTGRES_STATUS" == "success" ]] || FAILED_JOBS+=("e2e-local-postgres ($POSTGRES_STATUS)") [[ "$WINDOWS_STATUS" == "success" ]] || FAILED_JOBS+=("e2e-windows ($WINDOWS_STATUS)") - [[ "$COMMUNITY_STATUS" == "success" ]] || FAILED_JOBS+=("e2e-community ($COMMUNITY_STATUS)") fi if [[ ${#FAILED_JOBS[@]} -gt 0 ]]; then